所以这是另一个“向 X 编写查询”挑战。
我正在监视许多联网的自动售货机。每台机器都有许多部件,例如钞票接收器、硬币系统、打印机等。
机器零件的问题记录在表中,我们称之为“故障”,它看起来像这样(省略了不相关的字段):
machineid partid start_time end_time
--------- ------ ---------------- ----------------
1 2 2009-10-05 09:00 NULL
1 3 2009-10-05 08:00 2009-10-05 10:00
2 2 2009-09-30 12:00 2009-09-30 14:00
3 4 2009-09-28 13:00 2009-09-28 15:00
3 2 2009-09-28 12:00 2009-09-28 14:00
如果问题当前正在进行,则 end_date 为 NULL。
我需要一个查询来显示整个机器停机的时间段,并且可以解释重叠范围,将它们折叠成一条记录。因此,对于上面的示例数据,它将产生:
machineid start_time end_time
--------- ---------------- ----------------
1 2009-10-05 08:00 NULL
2 2009-09-30 12:00 2009-09-30 14:00
3 2009-09-28 12:00 2009-09-28 15:00
编写程序代码来逐行执行此操作并不难,但一个好的声明性 SQL 查询会更有用、更优雅。似乎应该是可能的,但我只是无法到达那里。
SQL方言是Oracle。如果有帮助,可以使用分析函数。
谢谢!