使用DISTINCT子句过滤数据但仍然拉出其他不是DISTINCT的字段

min*_*nic 13 sql postgresql ruby-on-rails distinct

我试图在Postgresql中编写一个查询,该查询提取一组有序数据并通过一个不同的字段对其进行过滤.我还需要从同一个表行中提取其他几个字段,但是它们需要被排除在不同的评估之外.例:

  SELECT DISTINCT(user_id) user_id, 
         created_at 
    FROM creations 
ORDER BY created_at   
   LIMIT 20
Run Code Online (Sandbox Code Playgroud)

我需要的user_idDISTINCT,但不关心的created_at日期是否唯一与否.因为created_at日期包含在评估中,所以user_id我的结果集中会出现重复.

此外,数据必须按日期排序,因此DISTINCT ON此处不能使用.它要求该DISTINCT ON字段是该ORDER BY子句中的第一个字段,并且不能提供我所寻求的结果.

如何正确使用该DISTINCT子句,但在仍然选择其他字段的同时将其范围限制为仅一个字段?

Bil*_*win 5

正如您所发现的那样,标准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
Run Code Online (Sandbox Code Playgroud)

您必须将不同的表达式包含在ORDER BY子句的最左侧部分中.

有关详细信息,请参阅DISTINCT子句的手册.