只有在重复行上选择最大分钟数DateDiff,SQL
我有两个表,TableA有列:Job,Machine,CutStart,CutEnd。表B有列:作业,开始,结束。表A有作业和机器的主键。表B有作业的主键。实质上,tableB是来自tableA多台机器的所有东西聚集在一起的地方。我需要拉tableA.CutStart和tableB.End之间的最长时间差。由于有多台机器与单个作业相关联,因此每个作业都会产生多个与分钟相关的差异,而我只需选择最大的一个。这是我的代码到目前为止。此外,请注意,该工作的形式是smalldatetime。还有一些其他各种语句可以删除不良数据。只有在重复行上选择最大分钟数DateDiff,SQL
SELECT tableA.Job, DateDiff(MINUTE, tableA.cutstart, tableB.end) as 'total minute'
From tableA
left join tableB on
tableA.Job = tableB.Job
where tableA.Job >= '2016-02-01' AND tableA.Job <= (DATEADD(Month, 1, '2016-02-01'))
AND datediff(Minute, tableA.cutstart, tableB.end) < 17280 AND datediff(Minute, tableA.cutstart, tableB.End) > 20
group by tableA.Job, tableA.CutStart, tableB.End order by tableA.Job
一个例子。 表A的工作A和B有3个不同的机器,每个机器都有自己独立的cutstart和cut end。表B只有作业A和B,每个作业有一个开始和结束。如果你运行上面的代码,你会得到6个结果,我只想要2个。这2个结果是tableA.cutstart和tableB.end之间最大差距的时间差。
-------------- ----------- UPDATE
表A
Job Machine CutStart CutEnd
A 5 2016-02-03 08:56 2016-02-03 10:50
A 6 2016-02-03 07:32 2016-02-03 9:42
A 7 2016-02-03 09:12 2016-02-03 11:15
B 5 2016-02-03 08:56 2016-02-03 10:50
B 6 2016-02-03 08:56 2016-02-03 10:50
B 7 2016-02-03 08:56 2016-02-03 10:50
表B
Job Start End
A 2016-02-03 13:53 2016-02-03 15:32
B 2016-02-03 13:53 2016-02-03 15:32
当前结果
Job "Minute difference"
A 54
A 112
A 96
B 154
B 93
B 217
预期结果
Job "Minute difference"
A 112
B 217
我只想选择每个作业上最长的minuet差异。此外,数字不加起来,他们只是占位符。
----------------------最终解决方案------------------
SELECT tableB.Job, DateDiff(MINUTE, (
SELECT MIN(tableA.cutstart)
FROM tableA
WHERE tableA.Job=tableB.Job
), tableB.end) as [total minute]
From tableB
where {whatever conditions you want}
如何看待一个SQL开发人员:
“我需要拉最长的...”
翻译为:
“我需要的顶部1,通过有序的......”
所以有些兴这样的:
SELECT TOP 1 tableA.Job, DateDiff(MINUTE, tableA.cutstart, tableB.end) as [total minute]
From tableA
left join tableB on
tableA.Job = tableB.Job
where {whatever conditions you want)
ORDER BY DateDiff(MINUTE, tableA.cutstart, tableB.end) DESC
编辑:如果你想要的最长运行时间为每个作业,答案是考虑更容易。
该作业只有一个结束时间,因此每个作业的最长运行时间将是tableA中具有最早开始时间的连接行。
这里有一种方法来获取(有很多):
SELECT tableB.Job, DateDiff(MINUTE, (
SELECT MIN(tableA.cutstart)
FROM tableA
WHERE tableA.Job=tableB.Job
), tableB.end) as [total minute]
From tableB
where {whatever conditions you want}
只是要小心,把主与表B条件的WHERE子句,以及与TableA的子查询的条件。
不太确定这里的问题是什么。但是,为什么你使用日期字面量的DATEADD?为什么不只是'2016-03-01'? –
@SeanLange但如语句返回2016年2月1日和3月1日,2016年所有日期的工作是在SMALLDATETIME的形式,你所看到的是选择在二月份的所有作业该行。我只是使用dateadd在一个月内运行该日期。它为我返回价值。 – Cheddar
@SeanLange总之我可以改变该行tableA.job> =“2016年2月1日” AND TableA.job Cheddar