我有一个sql表,看起来像这样:
user_id | data1 0 | 6 0 | 6 0 | 6 0 | 1 0 | 1 0 | 2 1 | 5 1 | 5 1 | 3 1 | 3 1 | 3 1 | 7
我想编写一个返回两列的查询:一列用于用户ID,另一列用于每个id最常出现的值.在我的示例中,对于user_id 0,最常见的值是6,而对于user_id 1,最常见的值是3.我希望它看起来如下所示:
user_id | most_frequent_value 0 | 6 1 | 3
我使用下面的查询来获取最频繁的值,但它针对整个表运行并返回整个表的最常见值,而不是每个id.我需要添加什么才能让它为每个id返回最常用的值?我在想我需要使用子查询,但我不确定如何构造它.
SELECT user_id,data1 AS most_frequent_value FROM my_table GROUP BY user_id,data1 ORDER BY COUNT(*) DESC LIMIT 1
解决方法
如果你使用正确的“order by”,那么distinct(user_id)会做同样的工作,因为它需要来自“user_id”分区的数据的1.line. DISTINCT ON是Postgresql的专长.
select distinct on (user_id) user_id,most_frequent_value from ( SELECT user_id,data1 AS most_frequent_value,count(*) as _count FROM my_table GROUP BY user_id,data1) a ORDER BY user_id,_count DESC