2016-12-14 27 views
7

我在SQL表看起來像這樣:如何在每個ID組中選擇列中最頻繁的值?

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 
+1

怎麼樣畫? (即你在你的例子中增加了一個「(0,1)」行;然後'6'和'1'是最頻繁的值,因爲它們都發生3次)。 – pozs

回答

2

如果「按訂單」使用正確的,然後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 
+0

我可以知道爲什麼-1嗎? 因爲我在這個例子上測試了它,我經常使用相同的查詢.... – JosMac

+0

這很好用 - 謝謝!我也想知道爲什麼它有-1票(那不是我) – cjh193

+0

如果OP不關心抽籤,這可能會起作用。 – pozs

1

您可以使用窗口函數根據data1的數量對用戶標準進行排序。

; 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

隨着postgres 9.4或更大,這是可能的。你可以像這樣使用它:

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 
相關問題