我有一个数据表,详细列出了父表上一行的操作顺序,其中列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