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

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

该问题在标题中有点难以解释:

我有下表:

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

这里是规则:

  1. 该对(ColB,ColC)应该是唯一的。
  2. 如果存在一对(ColB,ColC)且ColC!= null,则应过滤掉任何其他对(ColB,ColC)ColC = null。
  3. 如果不存在对(ColB,ColC)且ColC!=为空,而对对(ColB,ColC)的ColC = null,则在表中应出现一对对(ColB,ColC),且ColC = null。

在示例表中,由于第四行,第三行被滤除。第五行未过滤掉,因为没有其他行的ColB = 3且ColC!= null。

sql postgresql
1个回答
0
投票

使用分析功能:

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

SELECT ColA, ColB, ColC
FROM cte
WHERE (cnt > 0 AND ColC IS NOT NULL) OR cnt = 0;
© www.soinside.com 2019 - 2024. All rights reserved.