1

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

4

1 回答 1

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 的 Postgres扩展DISTINCTDISTINCT ON

  • Postgres 具有适当的布尔类型。您可以ORDER BY直接布尔表达式。顺序是FALSE(0), TRUE(1), NULL(NULL)。如果 a 为 NULL,则此表达式为FALSE并首先排序:(a IS NOT NULL)。其余的由 订购id。瞧。

  • 选择ID自动发生。根据您的描述,您需要在此查询中选择的行的 ID。没有什么可做的了。

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

于 2013-04-15T23:29:09.430 回答