从 oracle sql 查询输出中删除分区行

Removing Partitioned rows from oracle sql query output

我有以下查询

SELECT ROW_NUMBER() OVER ( PARTITION BY COLUMN1,  COLUMN2, COLUMN3 ORDER BY COLUMN1, COLUMN2) AS ROW_NUM, COLUMN1, COLUMN2, COLUMN3
FROM (SUBQUERY)
GROUP BY COLUMN1, COLUMN2, COLUMN3

OUTPUT of above query:-

我需要执行等同于

的操作
IF (COLUMN2 == 'PQR' AND COLUMN3 IS NOT NULL)
THEN 
"Delete whole partition from output having value A3 in column1"

解释:-

如果 COLUMN2 具有值 PQR 并且 COLUMN3 具有任何 DATE_TIME(即 NOT NULL),则所有对应的 COLUMN1 值不应出现在查询输出中。

OUTPUT required is:-

我尽量表达清楚。让我知道是否需要进一步澄清我的问题。

NOTE:- I want to remove those rows only from output of the query not from actual table.

如果你想要 select query 那么你可以使用 NOT EXISTS:

SELECT * FROM YOUR_TABLE T1
WHERE NOT EXISTS (SELECT 1 FROM YOUR_TABLE T2
WHERE T1.COLUMN1 = T2.COLUMN1
AND T2.COLUMN2 = 'PQR' AND T2.COLUMN3 IS NOT NULL);

您可以使用EXISTSdelete这样的记录如下:

DELETE FROM YOUR_TABLE T1
WHERE EXISTS (SELECT 1 FROM YOUR_TABLE T2
WHERE T1.COLUMN1 = T2.COLUMN1
AND T2.COLUMN2 = 'PQR' AND T2.COLUMN3 IS NOT NULL);

如果您使用子查询执行此操作,那么您可能需要使用 window 函数:

SELECT s.*
FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY COLUMN1,  COLUMN2, COLUMN3 ORDER BY COLUMN1, COLUMN2) AS ROW_NUM,
             COLUMN1, COLUMN2, COLUMN3,
             COUNT(CASE WHEN COLUMN2 = 'PQR' THEN COLUMN3 END) OVER (PARTITION BY COLUMN1) as cnt
      FROM (SUBQUERY)
      GROUP BY COLUMN1, COLUMN2, COLUMN3
     ) s
WHERE cnt = 0;

这会计算 COLUMN3 个值的数量,其中 COLUMN2 = 'PQR' 超过每个 COLUMN1。然后 returns 只有此计数为 0.

的行

这种方法的优点是它只评估一次子查询——如果它很复杂,这可能是性能上的胜利(超过 NOT EXISTS)。