2011-06-09 71 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中删除了按列号排序,所以它在技术上已不再标准化,但可能仍得到广泛支持。