来自一个group-by的SQL两个条件

时间:2013-04-11 12:34:01

标签: sql postgresql duplicates greatest-n-per-group postgresql-9.0

我有一个包含一些“功能重复”记录的表 - 不同的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子句中,或者用在聚合函数中。

1 个答案:

答案 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。没什么可做的。

  • 您可以直接将其整合到重复的查询中。