如何在每个id组的列中选择最常用的值?

时间:2016-12-14 15:58:32

标签: sql postgresql select subquery

我在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

3 个答案:

答案 0 :(得分:4)

如果您使用正确的“order by”,那么distinct on (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 

答案 1 :(得分:2)

您可以使用窗口函数根据数据的计数对用户ID进行排名。

; WITH cte AS (
SELECT 
    user_id 
  , data1
  , ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY COUNT(data1) DESC) rn
FROM dbo.YourTable
GROUP BY
  user_id,
  data1)

SELECT
    user_id,
    data1
FROM cte WHERE rn = 1 

答案 2 :(得分:2)

使用postgres 9.4或更高版本,这是可能的。您可以像使用它一样使用它:

elementFromForm.disabled = true;