我正在尝试在 Postgresql 中编写一个查询,该查询提取一组有序数据并按不同的字段对其进行过滤。我还需要从同一表行中提取其他几个字段,但需要将它们排除在不同的评估之外。示例:
SELECT DISTINCT(user_id) user_id,
created_at
FROM creations
ORDER BY created_at
LIMIT 20
我需要 user_id
为 DISTINCT
,但不关心 created_at 日期是否唯一。因为 created_at 日期包含在评估中,所以我在结果集中得到了重复的 user_id
。
此外,数据必须按日期排序,因此在这里不能使用 DISTINCT ON
。它要求 DISTINCT ON
字段是 ORDER BY
子句中的第一个字段,但不会提供我寻求的结果。
如何正确使用 DISTINCT
子句并将其范围限制为一个字段,同时仍选择其他字段?
最佳答案
正如您所发现的,标准 SQL 将 DISTINCT
视为应用于整个选择列表,而不仅仅是一列或几列。这样做的原因是,将什么值放入您从 DISTINCT
中排除的列中是不明确的。出于同样的原因,标准 SQL 不允许您在使用 GROUP BY
的查询中包含不明确的列。
但是 PostgreSQL 有一个非标准的 SQL 扩展来允许你的要求:DISTINCT ON (expr)
。
SELECT DISTINCT ON (user_id) user_id, created_at
FROM creations
ORDER BY user_id, created_at
LIMIT 20
您必须在 ORDER BY 子句的最左侧包含不同的表达式。
请参阅 DISTINCT Clause 上的手册获取更多信息。
关于sql - 使用 DISTINCT 子句过滤数据但仍拉取其他非 DISTINCT 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868140/