SQL从一个组 - 由两个标准(SQL two criteria from one group-by

2019-10-18 00:38发布

我有一些“功能性副本”记录的表 - 不同的ID,但(甚至更多列)“用户数据”的4列是相同的。 我有一个查询工作,将选择具有这种重复的所有记录。

现在,我要选择,从每组重复的,他们的第一个任何有列A不为空-我已经从数据有每组最多1点这样的行验证-如果有没有在这个特殊的组,则该最小列的ID

我该如何选择? 在当时的情况和在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子句或在聚合函数可以使用。

Answer 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)。 如果是NULL,该表达式是FALSE和第一排序: (a IS NOT NULL) 其余的是通过有序的id 。 瞧。

  • 选择ID自动发生。 根据你的描述,你想在这个查询选择的行的ID。 无事可做。

  • 你或许可以这样直接集成到您的重复查询。



文章来源: SQL two criteria from one group-by