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

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

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

  1. ColA | ColB | ColC
  2. -----|------|------
  3. 1 |1 |2
  4. 1 |1 |3
  5. 1 |2 |null
  6. 1 |2 |5
  7. 1 |2 |6
  8. 1 |3 |null

我需要以下结果表:

  1. ColA | ColB | ColC
  2. -----|------|------
  3. 1 |1 |2
  4. 1 |1 |3
  5. 1 |2 |5
  6. 1 |2 |6
  7. 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#

使用分析函数:

  1. WITH cte AS (
  2. SELECT *, COUNT(ColC) OVER (PARTITION BY ColA, ColB) cnt
  3. FROM yourTable
  4. )
  5. SELECT ColA, ColB, ColC
  6. FROM cte
  7. WHERE (cnt > 0 AND ColC IS NOT NULL) OR cnt = 0;

演示

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

展开查看全部

相关问题