有人可以给我一个关于棘手的 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 之前。如果没有对应的伙伴,则忽略此行。我说得不够清楚,对不起。
非常感谢弗里德海姆