【发布时间】:2014-03-30 13:15:52
【问题描述】:
我的过程仪表数据有两个表, 第一个表有机器 ID、跳闸时间、跳闸原因
Machine ID Trip Time Trip Reason
XA-065 03-20-2014 09:40:098 ANY
XA-065 03-24-2014 18:33:040 ANY
XA-765 03-23-2014 22:16:002 ANY
XA-070 03-21-2014 15:17:023 ANY
第二个表有机器ID,开始时间。
Machine ID Start Time Operator
XA-065 03-20-2014 12:40:098 ANY
XA-065 03-24-2014 20:33:040 ANY
XA-765 03-23-2014 23:16:002 ANY
XA-070 03-21-2014 18:17:023 ANY
我要加入这两个表,所以,对于每台机器,我可以获得机器 ID、行程时间、开始时间,然后我可以添加一个计算列来获取停机时间“开始时间 - 行程时间” 问题是,当同一台机器启动并跳闸多次时,JOIN 操作匹配所有可能的跳闸/启动组合。这会导致错误的停机时间计算。 这是 My Join 的结果,注意机器 XA-065 发生了什么:
Machine ID Trip Time Start Time Downtime
XA-065 03-20-2014 09:40:098 03-20-2014 12:40:098 3 Hours
XA-065 03-20-2014 09:40:098 03-24-2014 20:33:040 **11 hours**
XA-065 03-24-2014 18:33:040 03-20-2014 12:40:098 **-6 Hours**
XA-065 03-24-2014 18:33:040 03-24-2014 20:33:040 2 Hours
XA-765 03-23-2014 22:16:002 03-23-2014 23:16:002 1 Hour
XA-070 03-21-2014 15:17:023 03-21-2014 18:17:023 3 Hours
因为 JOIN 将采用相同机器 ID 的所有可能组合,所以我得到了错误的数据,11 小时,-6 小时停机时间“第二和第三行”。 如何过滤 JOIN 操作以摆脱这种情况? 我按降序对这两个表进行了排序,因此,正确的值排在第一位,但我仍然得到错误的 JOINED 行。
我们非常感谢您的帮助。 A.A
【问题讨论】:
-
如果我正确理解您的情况,第二个表中的每个“开始时间”都对应于第一个表中的一个“行程时间”。那么你的数据库模式一开始就是错误的;你应该把它们都放在一张桌子上。
-
当出现这种情况时,您要过滤掉哪些记录? IOW,在此示例中,您对机器
XA-065期望什么结果?Start Time是否应该总是晚于Trip Time才能产生有效结果? -
我只期待第一行和第三行,XA-065 03-20-2014 09:40:098 03-20-2014 12:40:098 3Hours XA-065 03-24- 2014 18:33:040 03-24-2014 20:33:040 2 小时
标签: sql-server inner-join