简体   繁体   English

按日期间隔查找重复项

[英]Find duplicates by date interval

I have the first 3 columns in the below table and I would like to obtaing the 4th one (CLASHING).我有下表中的前 3 列,我想获得第 4 列(冲突)。 If, over partition by account, the period between start and end dates is clashing, I would like to mark it as 'X'.如果按帐户进行分区,开始日期和结束日期之间的时间段发生冲突,我想将其标记为“X”。

ACCOUNT     START         END   CLASHING
----------------------------------------
      1 30-Sep-21   28-Oct-21         NO
      1 01-Jul-21   20-Aug-21         NO
      2 30-Jul-21   28-Oct-21        YES
      2 01-Jul-21   20-Aug-21        YES

You can use:您可以使用:

SELECT t.*,
       CASE
       WHEN EXISTS(SELECT 1
                   FROM   table_name x
                   WHERE  x."START" < t."END"
                   AND    x."END"   > t."START"
                   AND    x.account = t.account
                   AND    x.ROWID   != t.ROWID)
       THEN 'YES'
       ELSE 'NO'
       END AS clashing
FROM   table_name t

Which, for the sample data:其中,对于样本数据:

CREATE TABLE table_name (ACCOUNT, "START", "END") AS
SELECT 1, DATE '2021-09-30', DATE '2021-10-28' FROM DUAL UNION ALL
SELECT 1, DATE '2021-07-21', DATE '2021-08-20' FROM DUAL UNION ALL
SELECT 2, DATE '2021-07-30', DATE '2021-10-28' FROM DUAL UNION ALL
SELECT 2, DATE '2021-07-01', DATE '2021-08-20' FROM DUAL;

Outputs:输出:

ACCOUNT帐户 START开始 END结尾 CLASHING冲突
1 1 30-SEP-21 30-SEP-21 28-OCT-21 21 年 10 月 28 日 NO
1 1 21-JUL-21 21 年 7 月 21 日 20-AUG-21 20-8-21 NO
2 2 30-JUL-21 21 年 7 月 30 日 28-OCT-21 21 年 10 月 28 日 YES是的
2 2 01-JUL-21 01-JUL-21 20-AUG-21 20-8-21 YES是的

db<>fiddle here db<> 在这里小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM