2015-06-05 43 views
2

以下是包含2列的示例表格。基於特定項目出現次數的表格排序

id | name 
------------ 
    1 | hello 
    2 | hello 
    3 | hello 
    4 | hello 
    5 | world 
    6 | world 
    7 | sam 
    8 | sam 
    9 | sam 
10 | ball 
11 | ball 
12 | bat 
13 | bat 
14 | bat 
15 | bat 
16 | bat 

在這裏上表中的發生計數

hello - 4 
world - 2 
sam - 3 
ball - 2 
bat - 5 

如何寫PSQL查詢,使得輸出會從特定的名字最多發生進行排序到最小?即這樣

bat 
bat 
bat 
bat 
bat 
hello 
hello 
hello 
hello 
sam 
sam 
sam 
ball 
ball 
world 
world 

回答

4

您可以使用臨時表來獲得所有計數的名稱,然後JOIN是原始表進行排序:

SELECT yt.id, yt.name 
FROM your_table yt INNER JOIN 
(
    SELECT COUNT(*) AS the_count, name 
    FROM your_table 
    GROUP BY name 
) t 
ON your_table.name = t.name 
ORDER BY t.the_count DESC, your_table.name DESC 
+1

你可能需要添加',your_table.name'來排序,以增加一些穩定性和別名' SELECT'子句中的名稱列。 – zerkms

+0

@zerkms是的,你是正確的,OP意味着它想要這個。 –

+0

感謝Tim的回覆。它第一次運作。然後爲「sam」添加另一個條目以使其計數爲4,然後執行查詢。結果有點瘋狂。你可以請你嘗試在你的設置相同。我可能會做錯事。 – user1416065

-1
SELECT count(ID) cnt, NAME 
FROM table_name 
GROUP BY NAME 
ORDER BY count(ID) DESC; 
2

替代的解決方案使用的窗函數:

select name from table_name order by count(1) over (partition by name) desc, name; 

這將避免掃描table_name兩倍T中即時消息的解決方案,並可能在更大的情況下執行更大的大小table_name大小。

0

你可以用一個時間表格做好,如果原始表被命名爲排序:

create temp table counted as select name, count(name) from sorting group by name; 

select sorting.name from sorting, counted where sorting.name = counted.name order by count desc; 
相關問題