【问题标题】:How to replace a DISTINCT ON with GROUP BY in PostgreSQL 9?如何在 PostgreSQL 9 中用 GROUP BY 替换 DISTINCT ON?
【发布时间】:2015-01-29 13:40:39
【问题描述】:

我一直在使用 DISTINCT ON 谓词,并决定将其替换为 GROUP BY,主要是因为它“不是 SQL 标准的一部分,由于其结果可能具有不确定性,因此有时被认为是不好的样式”。

我将 DISTINCT ON 与 ORDER BY 结合使用以选择历史记录表中的最新记录,但我不清楚如何对 GROUP BY 执行相同操作。 什么是从一个构造转移到另一个构造的通用方法?

一个例子可以是

SELECT
  DISTINCT ON (f1, f2 ) *
  FROM table
  ORDER BY f1, f2, datefield DESC;

我得到“最新”的 (f1,f2) 对。

【问题讨论】:

  • 。 .请展示您的查询示例。
  • 第 7.3.3 章不鼓励使用 DISTINCT ON。一旦我找到那封电子邮件,我会在这里引用它关于计划器和“distinct on”优化的内容。
  • 改写了我的问题
  • "其结果的潜在不确定性" - 仅当您忘记 order by 或指定不稳定的排序顺序时(例如,重复值可能出现在排序列) - 但该问题也适用于使用窗口函数的解决方案。

标签: sql postgresql group-by distinct-on


【解决方案1】:

如果您有这样的查询:

select distinct on (col1) t.*
from table t
order by col1, col2

然后你会用窗口函数代替它,而不是group by

select t.*
from (select t.*,
             row_number() over (partition by col1 order by col2) as seqnum
      from table t
     ) t
where seqnum = 1;

【讨论】:

  • @a_horse_with_no_name 。 . .谢谢。
猜你喜欢
  • 2020-01-03
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2022-01-22
  • 2012-04-05
  • 2020-09-12
相关资源
最近更新 更多