我需要添加一列 (CTRL) 来验证每个分区 (ID) 中的日期序列 (REFERENCE_DATE) 是否正确,同时考虑列 NUM_ROLL;
数据库是ORACLE,我正在使用SQL DEVELOPER 数据按 ID、NUM_ROLL、REFERENCE_DATE 排序
我希望新列 CTRL 的值为 0 或 1
如果对于每个
PARTITION ID
,您想先按NUM_ROLL
排序,然后按REFERENCE_DATE
排序,并检查前一个REFERENCE_DATE
是否小于当前REFERENCE_DATE
,则可以使用LAG
分析函数和一个 CASE
表达式:
SELECT t.*,
CASE
WHEN LAG(reference_date) OVER (
PARTITION BY partition_id
ORDER BY num_roll, reference_date
) >= reference_date
THEN 1
ELSE 0
END AS ctrl
FROM table_name t
对于样本数据:
CREATE TABLE table_name (partition_id, num_roll, reference_date) AS
SELECT 'A', 1, DATE '2024-07-15' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2024-07-16' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2024-07-14' FROM DUAL UNION ALL
SELECT 'A', 2, DATE '2024-07-17' FROM DUAL UNION ALL
SELECT 'B', 2, DATE '2024-06-04' FROM DUAL UNION ALL
SELECT 'B', 2, DATE '2024-06-05' FROM DUAL UNION ALL
SELECT 'B', 3, DATE '2024-06-06' FROM DUAL UNION ALL
SELECT 'B', 4, DATE '2024-06-07' FROM DUAL UNION ALL
SELECT 'B', 5, DATE '2024-06-10' FROM DUAL;
输出:
分区ID | NUM_ROLL | REFERENCE_DATE | CTRL |
---|---|---|---|
A | 1 | 2024-07-15 00:00:00 | 0 |
A | 2 | 2024-07-14 00:00:00 | 1 |
A | 2 | 2024-07-16 00:00:00 | 0 |
A | 2 | 2024-07-17 00:00:00 | 0 |
B | 2 | 2024-06-04 00:00:00 | 0 |
B | 2 | 2024-06-05 00:00:00 | 0 |
B | 3 | 2024-06-06 00:00:00 | 0 |
B | 4 | 2024-06-07 00:00:00 | 0 |
B | 5 | 2024-06-10 00:00:00 | 0 |