2011-06-09 57 views
2

我有以下SQL語句。max(),按組排序按

SELECT t.client_id,max(t.points) AS "max" FROM sessions GROUP BY t.client_id; 

它只是列出客戶端ID與他們已經取得的最大數量的點。現在我想按max(t.points)排序結果。通常我會使用ORDER BY,但我不知道如何將它用於組。我知道使用SELECT列表中的值在以下子句中是被禁止的,所以在查詢結尾添加ORDER BY max將不起作用。

如何在分組後對結果進行排序?

問候

回答

5
SELECT t.client_id, max(t.points) AS "max" 
FROM sessions t 
GROUP BY t.client_id 
order by max(t.points) desc 
+0

謝謝你的快速回答。我只是想出了點列實際上是字符變化(),所以我用了數字函數,現在它工作。 – stilz 2011-06-09 20:32:05

+1

爲什麼不在表中使用正確的數據類型?這也會加快查詢速度,在該列上創建索引並且查詢速度會更快。當您需要一個數字時,varchar上的索引不起作用。 – 2011-06-09 20:35:51

+0

對不起,我沒有建立這張表,也沒有權利改變它的結構。只需爲現有的CRM編寫一些軟件即可。我要告訴管理員改變這一點。 – stilz 2011-06-09 20:42:41

0

既然你已經標記爲Postgres的:Postgres允許一個非標準GROUP BYORDER BY列數。所以,你可以有

SELECT t.client_id, max(t.points) AS "max" 
FROM sessions t 
GROUP BY 1 
order by 2 desc 

解析後,這是相同的RedFilter ’的解決。

1

從以下條款中禁止SELECT列表中的值是不正確的。實際上,ORDER BYSELECT列表之後被邏輯處理,並且可以參考SELECT列表結果名稱(與GROUP BY相反)。所以正常的方式來寫你的查詢將是

SELECT t.client_id, max(t.points) AS "max" 
    FROM sessions 
    GROUP BY t.client_id 
    ORDER BY max; 

這種表達方式是SQL-92,應該是非常便攜的。另一種方法是按列編號,例如

ORDER BY 2; 

這些是SQL-92中唯一的兩種方法。

SQL:1999及更高版本還允許在排序列表中引用任意表達式,因此您可以僅執行ORDER BY max(t.points),但這顯然比較麻煩,並且可能不太方便。在SQL:1999中刪除了按列號排序,所以它在技術上已不再標準化,但可能仍得到廣泛支持。