cjh*_*193 8 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
Run Code Online (Sandbox Code Playgroud)
我想编写一个返回两列的查询:一列用于用户ID,另一列用于每个id最常出现的值.在我的示例中,对于user_id 0,最常见的值是6,而对于user_id 1,最常见的值是3.我希望它看起来如下所示:
user_id | most_frequent_value
0 | 6
1 | 3
Run Code Online (Sandbox Code Playgroud)
我使用下面的查询来获取最频繁的值,但它针对整个表运行并返回整个表的最常见值,而不是每个id.我需要添加什么才能让它为每个id返回最常用的值?我想我需要使用子查询,但不确定如何构造它.
SELECT user_id, data1 AS most_frequent_value
FROM my_table
GROUP BY user_id, data1
ORDER BY COUNT(*) DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
您可以使用窗口函数根据用户的 data1 计数对用户 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
Run Code Online (Sandbox Code Playgroud)
如果您使用正确的“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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5802 次 |
| 最近记录: |