首页 > 解决方案 > SELECT DISTINCT ON (col) * 有效吗?

问题描述

SELECT DISTINCT ON (some_col)
*
FROM my_table

我想知道这是否有效并且会按预期工作。意思是,这会返回 my_table 中的所有列,基于 distinctsome_col吗?我已经阅读了 Postgres 文档,看不出有什么理由不能按预期工作,但是在这里阅读了关于 SO 的旧评论,其中指出在使用 distinct on 时需要明确列出列。

我知道最好的做法是明确列出列,并在执行上述操作时使用 order by。

您可能不需要或不关心的背景

对于背景和我问的原因,我们正在从 MySQL 迁移到 Postgres。MySQL 有一个非常不符合标准的“技巧”,SELECT * ... GROUP BY它允许一个轻松地select *基于group by. 以前关于将这种不符合标准的技巧迁移到 Postgres 的答案和评论充其量是模糊的。

标签: sqlpostgresqlgreatest-n-per-grouppostgresql-13distinct-on

解决方案


SELECT DISTINCT ON (some_col) *
FROM   my_table;

我想知道这是否有效

是的。通常,您希望ORDER BY使用它来确定从每组对等点中选择哪一行。但是选择任意行(不带ORDER BY)是有效的(有时很有用!)应用程序。你只需要知道你在做什么。也许为来世添加评论?

看:

这会根据不同的 some_col 返回 my_table 中的所有列吗?

它将返回所有列。每个不同的值一个任意行some_col

请注意我如何使用“任意”一词,而不是“随机”。返回的行根本不是随机选择的。只是任意的,取决于当前的实现细节。通常每个不同值的物理第一行,但这取决于。

我知道明确列出列是最佳做法。

这真的取决于。通常是这样。有时不是。就像我想让所有列匹配给定的行类型一样。


推荐阅读