Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何为每个id组选择列中最频繁的值?_Sql_Postgresql_Select_Subquery - Fatal编程技术网

Sql 如何为每个id组选择列中最频繁的值?

Sql 如何为每个id组选择列中最频繁的值?,sql,postgresql,select,subquery,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_i

我在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 on(user\u id)
将执行相同的操作,因为它从按“user\u id”分区的数据中提取1.5行
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 

您可以使用窗口函数根据用户ID的数据计数对其进行排序1

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 
对于博士后或更高的学生,这是可能的。您可以像这样使用它:

SELECT 
    user_id, MODE() WITHIN GROUP (ORDER BY value) 
FROM  
    (VALUES (0,6), (0,6), (0, 6), (0,1),(0,1), (1,5), (1,5), (1,3), (1,3), (1,7)) 
    users (user_id, value)
GROUP BY user_id

我可以知道为什么吗?因为我在这个examle上测试了它,并且我经常使用相同的查询…这非常有效-谢谢!我也想知道为什么投了-1票(那不是我),你的评论用简单的英语是什么意思?正如我在上写的那样,DISTINCT是PostgreSQL的特长,它的作用与下面提到的窗口函数相同。那么draws呢?(即,将
(0,1)
行添加到示例中;然后
6
1
都是最常见的值,因为它们都出现了3次)。