我需要进行控制来验证每个分区(按 ID)中的日期顺序是否正确

问题描述 投票:0回答:1

我需要添加一列 (CTRL) 来验证每个分区 (ID) 中的日期序列 (REFERENCE_DATE) 是否正确,同时考虑列 NUM_ROLL;

数据库是ORACLE,我正在使用SQL DEVELOPER 数据按 ID、NUM_ROLL、REFERENCE_DATE 排序

当前表以及我必须创建的新列

我希望新列 CTRL 的值为 0 或 1

oracle sequence partitioning
1个回答
0
投票

如果对于每个

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.