【问题标题】:Find duplicates by date interval按日期间隔查找重复项
【发布时间】:2021-12-07 03:52:09
【问题描述】:

我有下表中的前 3 列,我想获得第 4 列(CLASHING)。如果按帐户划分,开始日期和结束日期之间的时间段发生冲突,我想将其标记为“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

【问题讨论】:

  • 你能解释一下你所说的重复是什么意思吗?您的输入数据是什么,您使用什么选择来获取该输出?以及您期望与显示的输出相关的输出是什么?

标签: sql oracle plsql


【解决方案1】:

你可以使用:

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

其中,对于样本数据:

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;

输出:

ACCOUNT START END CLASHING
1 30-SEP-21 28-OCT-21 NO
1 21-JUL-21 20-AUG-21 NO
2 30-JUL-21 28-OCT-21 YES
2 01-JUL-21 20-AUG-21 YES

db小提琴here

【讨论】:

  • 它抛出 -01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc. 01446. 00000 - "cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY 等”
  • @banana_99 我给出的查询不使用DISTINCTGROUP BY 并且答案底部链接的小提琴表明它有效。
  • @banana_99 它适用于 Oracle 11gR2 db<>fiddle
  • 我的 table_name 是 CTE。有没有什么办法可以逃脱 ORA 01446 而不必先创建表?
  • @banana_99 可能,但如果没有复制问题的minimal reproducible example,就不可能回答。如果您创建一个复制问题的小提琴,那么您可能能够获得解决方案。
猜你喜欢
  • 2013-06-28
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多