我有两个表,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}
答案 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相关的条件。