【问题标题】:Order by the max value in the group按组中的最大值排序
【发布时间】:2013-05-04 04:06:41
【问题描述】:

我想按一列 (NAME) 对我的结果进行分组,然后为每个组按第二列 (NOTE) 排序,最后按组的最高注释对这些组进行排序。

所以,如果我的实体像这样被打乱:

NAME         NOTE
Andrew       19
Thomas       18
Andrew       18
Andrew       17
Frank        16 
Frank        15
Thomas       14 
Thomas       12
Frank        5

我希望它们像这样订购:

NAME         NOTE
Andrew       19
Andrew       18
Andrew       17
Thomas       18
Thomas       14 
Thomas       12
Frank        16 
Frank        15
Frank        5

按名称分组,安德鲁首先出现,因为他的最高音是 19,然后是托马斯(18)和弗兰克(16)。

问候,

【问题讨论】:

    标签: sql sql-server sql-server-2008 group-by sql-order-by


    【解决方案1】:

    很简单的方法:

    从NameNoteTable中选择名字,笔记 按名称 asc 排序,注意 desc

    【讨论】:

    • 此查询按字母顺序排列name 列。在问题中,name 列应根据每个用户note 的降序排列
    【解决方案2】:
    SELECT t.name, t.note
    FROM @tbl t
    ORDER BY (SELECT MAX(note) FROM @tbl WHERE name = t.name) DESC
            , name
            , note DESC 
    

    这是最简单的方法,使用 PARTITION BY 只是语法稍微多一些,并且在更大的表上可能会更有效地运行。

    【讨论】:

      【解决方案3】:

      这是一种使用窗口函数的方法:

      select name, note
      from (select t.*, max(note) over (partition by name) as maxnote
            from t
           ) t
      order by maxnote desc, name
      

      除了按maxnote排序,它还按名字排序。如果有联系,则它将给定名称的所有记录保存在一起。

      【讨论】:

      • +1 你可以引用order by之后的别名,所以不需要子查询
      • @Andomar 。 . .如果它是这样写的,那么maxnote 必须在输出中。
      • @GordonLinoff 不错,按顺序排列的 maxnote 后面应该有 desc,但很好的解决方案。
      • @Valerio Volga - note 列在此解决方案中未按降序排列,如果您对测试值进行洗牌并运行此查询,则名称分区内的便笺没有排序。
      【解决方案4】:

      CTE 答案...

      Create  Table NameNoteTable (Name Varchar(10), Note Int);
      
      Insert  NameNoteTable
      Select  'Andrew', 19
      Union   All
      Select  'Andrew', 18
      Union   All
      Select  'Andrew', 17
      Union   All
      Select  'Thomas', 18
      Union   All
      Select  'Thomas', 14
      Union   All
      Select  'Thomas', 12
      Union   All
      Select  'Frank', 16
      Union   All
      Select  'Frank', 15;
      
      With    cte As
      (
              Select  Row_Number() Over (Order By Max(Note) Desc) As tID,
                      Name,
                      Max(Note) As MaxNote
              From    NameNoteTable
              Group   By Name
      )
      Select  nnt.Name, nnt.Note
      From    NameNoteTable nnt
      Join    cte c
              On  nnt.Name = c.Name
      Order   By tID, Note Desc;
      

      【讨论】:

        猜你喜欢
        • 2018-05-15
        • 1970-01-01
        • 2021-10-02
        • 2018-10-21
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多