【问题标题】:max(), group by and order bymax()、分组依据和排序依据
【发布时间】:2011-09-12 00:36:33
【问题描述】:

我有以下 SQL 语句。

    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 将不起作用。

那么,分组后如何对这些结果进行排序呢?

最好的问候

【问题讨论】:

    标签: sql postgresql group-by sql-order-by max


    【解决方案1】:
    SELECT t.client_id, max(t.points) AS "max" 
    FROM sessions t
    GROUP BY t.client_id 
    order by max(t.points) desc
    

    【讨论】:

    • 感谢您的快速回答。我刚刚发现 points 列实际上是字符变量(),所以我使用了 to_number 函数,现在它可以工作了。
    • 为什么不在表中使用正确的数据类型?这也将加快查询速度,在该列上创建索引,查询会更快。当您需要数字时,varchar 上的索引将不起作用。
    • 对不起,我没有创建这个表,也没有权利改变它的结构。只是为现有的 CRM 编写一些软件。我要告诉管理员改变它。
    【解决方案2】:

    由于您已标记为 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的解决方案相同。

    【讨论】:

      【解决方案3】:

      SELECT 列表中的值在以下子句中被禁止是不完全正确的。实际上ORDER BY是在SELECT列表之后逻辑处理的,可以引用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 中删除了按列号排序,因此在技术上不再是标准,但可能仍得到广泛支持。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 2010-09-06
        相关资源
        最近更新 更多