【发布时间】:2013-04-03 15:43:43
【问题描述】:
我有一个包含一些“功能重复”记录的表 - 不同的 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 子句中或用于聚合函数中。
【问题讨论】:
-
也许是
COALESCE(MIN(CASE WHEN d.A IS NOT NULL THEN d.ID ELSE NULL END), MIN(D.ID))?仅当 D.A 不为空时才考虑 D.ID;如果找不到,将返回 min(d.id)。 -
完美!作为答案发布,我会接受。谢谢!
标签: sql postgresql duplicates greatest-n-per-group postgresql-9.0