仅在重复行SQL上选择最大分钟DateDiff

时间:2016-03-03 15:35:47

标签: sql sql-server group-by datediff

我有两个表,TableA有列:Job,Machine,CutStart,CutEnd。 TableB有列:job,Start,End。表A具有作业和机器的主键。 TableB有一个主要的工作。从本质上讲,tableB是来自tableA的多台机器的所有东西汇集在一起​​的地方。我需要将tableA.CutStart之间的最长时差拉到tableB.End。由于有多台计算机与单个作业相关联,因此每个作业关联的分钟数会有多个差异,我只需要选择最大的一个。到目前为止,这是我的代码。此外,请注意该作业采用smalldatetime的形式。还有一些其他各种where语句来删除不良数据。

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台不同的机器,每台机器都有自己独立的切口和切割端。表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

我只想在每项工作中选择最长的小步舞曲差异。此外,数字不加起来,他们只是占位符。

----------------------最终解决方案------------------

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}

1 个答案:

答案 0 :(得分:1)

如何像SQL Developer一样思考:

“我需要拉最长的......”

转换为:

“我需要前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

编辑:如果你想要每个工作的最长运行时间,答案就更容易思考。

作业只有一个结束时间,因此每个作业的最长运行时间是表格A中的连接行具有最早的开始时间。

这是达到这个目标的一种方式(有很多):

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}

请注意在主WHERE子句中放置与TableB相关的条件,并在子查询中放置与TableA相关的条件。