您可以使用带有IGNORE NULLS 子句的条件LAG 分析语句:
SELECT Order_id,
Order_status,
"DATE"
FROM (
SELECT t.*,
LAG(
CASE
WHEN order_status IN ('Received', 'Shipped', 'Partially Shipped', 'Cancelled')
THEN order_status
END
) IGNORE NULLS OVER (PARTITION BY order_id ORDER BY "DATE") AS prev_status
FROM table_name t
)
WHERE prev_status = 'Received'
AND order_status IN ('Shipped', 'Partially Shipped', 'Cancelled')
其中,对于样本数据:
CREATE TABLE table_name (Order_ID, Order_Status, "DATE") AS
SELECT 1, 'Received', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 1, 'Partially Shipped', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 1, 'Shipped', DATE '2021-01-02' FROM DUAL UNION ALL
SELECT 1, 'Returned', DATE '2021-02-01' FROM DUAL UNION ALL
SELECT 1, 'Received', DATE '2021-02-01' FROM DUAL UNION ALL
SELECT 1, 'Shipped', DATE '2021-03-01' FROM DUAL UNION ALL
SELECT 2, 'Received', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 2, 'Acknowledged', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 2, 'Shipped', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 3, 'Received', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 3, 'Acknowledged', DATE '2021-02-01' FROM DUAL UNION ALL
SELECT 4, 'Received', DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 4, 'Acknowledged', DATE '2021-02-01' FROM DUAL UNION ALL
SELECT 4, 'Received', DATE '2021-01-01' FROM DUAL;
输出:
| ORDER_ID |
ORDER_STATUS |
DATE |
| 1 |
Partially Shipped |
2021-01-01 00:00:00 |
| 1 |
Shipped |
2021-03-01 00:00:00 |
| 2 |
Shipped |
2021-01-01 00:00:00 |
db小提琴here