Oracle顺序操作

扫码查看

我有一个数据表,详细列出了父表上一行的操作顺序,其中列ID是该外键。 SEQ列是这些操作发生的顺序,而ACTION是发生的顺序。

ID          SEQ ACTION
12345.00    2   SUSPEND
12345.00    3   CLEAR
12345.00    4   SUSPEND
12345.00    6   CLEAR
12345.00    7   SUSPEND
12345.00    8   RESUME
12345.00    9   SUSPEND
12345.00    10  RESUME
12345.00    11  CLEAR

我试图以一种可以识别未清除的SUSPEND和RESUME操作的方式显示数据。在这种情况下,我的结果将如下所示:
12345.00    7   SUSPEND    8    RESUME
12345.00    9   SUSPEND

之所以如此,是因为;



ACTION列中可以包含其他 Action ,因此为了清楚起见,我将其删除。

如果清除操作成功,则清除该操作。

抱歉,这令人困惑。我无法更改架构!

我试图简化这个问题。
ID          SEQ ACTION
12345.00    2   SUSPEND
12345.00    3   RESUME
12345.00    4   CLEAR
12345.00    5   RESUME
12345.00    6   SUSPEND

结果应如下所示;
12345.00    2   SUSPEND   5 RESUME
12345.00    6   SUSPEND

我已经尝试了几种方法,但是我只是想不出如何阻止RESUME出现在第3位。

最佳答案

好的。现在,我从kordirko中窃取 fiddle ,从simon中窃取概念,然后用我的方式 cooking 。

CREATE TABLE TABLE1
(
   "ID"       INT,
   "SEQ"      INT,
   "ACTION"   VARCHAR2 ( 7 )
);

INSERT ALL
INTO   TABLE1 ( "ID", "SEQ", "ACTION" )
VALUES ( 12345.00, 2, 'SUSPEND' )
INTO   TABLE1 ( "ID", "SEQ", "ACTION" )
VALUES ( 12345.00, 3, 'RESUME' )
INTO   TABLE1 ( "ID", "SEQ", "ACTION" )
VALUES ( 12345.00, 4, 'CLEAR' )
INTO   TABLE1 ( "ID", "SEQ", "ACTION" )
VALUES ( 12345.00, 5, 'RESUME' )
INTO   TABLE1 ( "ID", "SEQ", "ACTION" )
VALUES ( 12345.00, 6, 'SUSPEND' )
   SELECT * FROM DUAL;

因此,我从您的问题中了解到的是,最初没有正确解释它。但是第二个预期的结果就成功了。 (我可能还是错的)
WITH AFTER_CHECK
     AS (SELECT T.ID,
                T.SEQ,
                T.ACTION,
                CASE
                   WHEN ACTION = 'CLEAR'
                   THEN
                      1
                   WHEN LEAD ( ACTION ) OVER (PARTITION BY ID ORDER BY SEQ) =
                           'CLEAR'
                   THEN
                      1
                   ELSE
                      0
                END
                   AS IGNORE_CURRENT
         FROM   TABLE1 T)
SELECT *
FROM   (SELECT T.ID,
               T.SEQ,
               T.ACTION,
               LEAD ( SEQ ) OVER (PARTITION BY ID ORDER BY SEQ) NEXT_SEQ,
               LEAD ( ACTION ) OVER (PARTITION BY ID ORDER BY SEQ)
                  NEXT_ACTION
        FROM   AFTER_CHECK T
        WHERE  IGNORE_CURRENT = 0)
WHERE  ACTION = 'SUSPEND';

输出:
12345   2   SUSPEND 5   RESUME
12345   6   SUSPEND

我所做的是分配一个标志来检查设置为CLEAR的ACTION或称为CLEAR的NEXT ACTION的被忽略的连续操作。然后,我使用kordirko的LEAD函数代码片段对所需的ACTION进行了过滤。

参见 fiddle here

10-07 19:17
查看更多