postgresql:如果列中的值已经存在,则过滤掉行

nwwlzxa7  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(350)

这个问题在标题中有点难以解释:
我有下表:

ColA | ColB | ColC
-----|------|------
1    |1     |2
1    |1     |3
1    |2     |null
1    |2     |5
1    |2     |6
1    |3     |null

我需要以下结果表:

ColA | ColB | ColC
-----|------|------
1    |1     |2
1    |1     |3
1    |2     |5   
1    |2     |6
1    |3     |null

规则如下:
这对(colb,colc)应该是唯一的。
如果一对(colb,colc)与colc!=null,则应过滤掉colc=null的任何其他对(colb,colc)。
如果colc不存在对(colb,colc)=null,但是存在colc=null的对(colb,colc),那么表中应该出现colc=null的单个对(colb,colc)。
在示例表中,第三行由于第四行而被过滤掉。第五行没有被过滤掉,因为没有其他行具有colb=3和colc!=无效的。

rqenqsqc

rqenqsqc1#

使用分析函数:

WITH cte AS (
    SELECT *, COUNT(ColC) OVER (PARTITION BY ColA, ColB) cnt
    FROM yourTable
)

SELECT ColA, ColB, ColC
FROM cte
WHERE (cnt > 0 AND ColC IS NOT NULL) OR cnt = 0;

演示

别名数量 cnt 是非
NULL ColC 每个a-b组的值。这个 WHERE 条款规定保留所有严格不符合要求的记录 NULL ,应该 ColC 至少有一个非 NULL 值,或保留所有记录,仅在 NULL 出现在 ColC .

相关问题