有人可以给我一个关于棘手的 SQL 问题的线索吗?我搜索了类似的问题,最接近的方法似乎是这样,但这不是我的问题的解决方案: Oracle - grouping between pairs of records
我知道这可以通过 PL/SQL 过程来实现,但在这种情况下(Oracle)SQL 是必要的。我正在寻找一个 Oracle SQL SELECT 来隔离普通表的 ID = 4 和 5 的特殊记录。该表仅包含 2 列:ID 和 DATE 它包含如下数据:
ID DATE REMARK (this row is not part of table!)
--------------- ------------------------------------------
2 01-JAN-2013
4 02-JAN-2013 A
7 03-JAN-2013
5 05-JAN-2013 A
6 07-JAN-2013
4 08-JAN-2013 B
1 11-JAN-2013
5 12-JAN-2013 B
... more follows
如果 ID 4 和 5 及时跟随,则它们属于同一组。因此,我标记为“A”的行属于一起,“B”也是如此。两个 As 和两个 B 属于一起,因为它们的日期是连续的。现在我想要得到的是一个返回 4 列的 SELECT,即一行中的两行 A,以及一行中的行 B。
所以输出应该是这样的:
ID4 DATE4 ID5 DATE5 Comment (no column, just comment)
--------------------------------- ------------------------------------
4 02-JAN-2013 5 05-JAN-2013 First set of 4 and 5
4 08-JAN-2013 5 12-JAN-2013 Second set of 4 and 5
...more follows
(当然 ID4 和 ID5 列已经过时,仅用于演示目的)
我希望我让自己可以理解?有人有想法吗?
更新:感谢您的想法和选择,很抱歉我的问题不够清楚。只应考虑成对的 4 和 5,并且只能按日期升序排列。对于上面的示例,Alex Pool 和 Florin Ghita 的解决方案很棒,谢谢!
4er 的日期必须小于或等于 5er 的日期。如果有一个 4er 或 5er 没有匹配的伙伴,它可以被忽略。
但这是另一个包含真实数据和陷阱的示例(解决方案在这里失败):按时间顺序遍历数据,有 2 行,连续 5 行。
4 16.03.2012 17:49:28 A
5 10.05.2012 09:38:56 A1 Either A1 is possible
5 12.06.2012 07:51:03 A2 or A2 whichever is easier to code
4 12.06.2012 08:47:52 B
5 02.08.2012 11:27:43 B
4 03.08.2012 13:24:54 C
5 03.08.2012 14:14:07 C
4 04.08.2012 15:00:00 should be ignored, as there is no following 5er
想要的输出:
4 16.03.2012 17:49:28 5 10.05.2012 09:38:56 (alternat.: 5 12.06.2012 07:51:03)
4 12.06.2012 08:47:52 5 02.08.2012 11:27:43
4 03.08.2012 13:24:54 5 03.08.2012 14:14:07
建议的 SELECTS 失败,因为他们不认为 4er 在时间上必须在 5er 之前。如果没有对应的伙伴,则忽略此行。我说得不够清楚,对不起。
非常感谢弗里德海姆