只有在重复行上选择最大分钟数DateDiff,SQL

只有在重复行上选择最大分钟数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} 
+0

不太确定这里的问题是什么。但是,为什么你使用日期字面量的DATEADD?为什么不只是'2016-03-01'? –

+0

@SeanLange但如语句返回2016年2月1日和3月1日,2016年所有日期的工作是在SMALLDATETIME的形式,你所看到的是选择在二月份的所有作业该行。我只是使用dateadd在一个月内运行该日期。它为我返回价值。 – Cheddar

+0

@SeanLange总之我可以改变该行tableA.job> =“2016年2月1日” AND TableA.job Cheddar

如何看待一个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的子查询的条件。

+0

我试图做一个选择顶部1,但它不工作,因为它只是选择在我的查询顶1号线项目。这张桌子有很多工作。每个作业都按照作业所运行的机器数量进行复制。因此,每个作业可能在tableA上有3到5个不同的机器。我需要每项工作的最长日期。 – Cheddar

+0

我已经更新了基于您澄清编辑我的回答更加明确 – Cheddar

+0

。 –