【问题标题】:SQL two criteria from one group-bySQL 来自一个分组的两个条件
【发布时间】: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


【解决方案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 扩展DISTINCT:DISTINCT ON:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多