我有一个包含一些“功能重复”记录的表 - 不同的ID,但是“用户数据”的4列(甚至更多列)是相同的。我有一个查询工作,将选择所有具有此类重复项的记录。
现在我想从每组重复项中首先选择列A
不为空的任何副本 - 并且我已从数据中验证每组最多有1个这样的行 - 并且如果此特定组中没有,则列ID
列的最小值。
如何选择?我无法在CASE的THEN和ELSE中的聚合中使用非聚合。例如。这不起作用:
SELECT CASE
WHEN d.A IS NULL THEN d.ID
ELSE MIN(d.ID) END,
d.B,
d.C,
d.E,
d.F
FROM TABLE T
JOIN (my duplicate query here) D ON T.B=D.B
AND T.C=D.C
AND T.E=D.E
AND T.F=D.F
GROUP BY T.B,
T.C,
T.E,
T.F
错误是:
列A必须出现在GROUP BY子句中,或者用在聚合函数中。
答案 0 :(得分:1)
这可以更简单:
SELECT DISTINCT ON (b, c, e, f)
b, c, e, f, id -- add more columns freely
FROM (<duplicate query here>) sub
ORDER BY b, c, e, f, (a IS NOT NULL), id
您的重复查询包含所有列。无需再次JOIN
到基表。
使用标准SQL DISTINCT
的Postgres扩展程序:DISTINCT ON
:
Postgres有一个合适的布尔类型。您可以直接ORDER BY
布尔表达式。序列为FALSE
(0),TRUE
(1),NULL
(NULL)。如果a为NULL,则此表达式为FALSE
并首先排序:(a IS NOT NULL)
。其余的按id
排序。瞧。
ID
的选择会自动发生。根据您的描述,您需要在此查询中选择的行的ID。没什么可做的。
您可以直接将其整合到重复的查询中。