【问题标题】:Select Rows with maximum column value grouped by another column without nested select statement选择具有最大列值的行,由另一列分组,没有嵌套选择语句
【发布时间】:2012-11-21 11:02:56
【问题描述】:

我知道这是Select Rows with Maximum Column Value group by Another Column 的副本,但我想选择具有最大列值的行,按另一列分组,但是没有嵌套的选择语句,我知道它可以这样做:

SELECT
    T.Name,
    T.Rank,
    T.ID
FROM MyTable T
WHERE T.Rank = (
    SELECT MAX( T1.Rank) FROM MyTable T1
    WHERE T1.Name= T.Name
)

其中ID, Rank, Name 是表架构,我想先按名称按结果分组,然后从每个名称组中选择一行,具体取决于哪一行的排名最高。

附件是我要从中选择的表格示例

【问题讨论】:

  • 您能否提供一些示例数据和所需的输出? HAVING 子句可能是您正在寻找的内容:dev.mysql.com/doc/refman/5.1/en/select.html
  • 附上表格样本,谢谢
  • 如何使用 HAVING 语句声明我希望那些项目具有最高排名?
  • @DrewPierce 是的,每个名字只有一个输出,在同名项目中排名最高
  • 然后只做一个 select name,max(rank) from mytable group by name order by name

标签: mysql sql sql-server


【解决方案1】:
mysql> SELECT t1.nm, t1.rank,t1.id
 FROM mytable t1
 LEFT JOIN (
   SELECT nm, max(rank) as top
   FROM mytable t2
   GROUP BY nm
 ) AS t2 ON t1.nm=t2.nm AND t1.rank = t2.top
 WHERE t2.nm IS not NULL
 ORDER BY nm;

+----+------+---------+
| nm | rank | id      |
+----+------+---------+
| m  |   -1 | b7kjhsf |
| n  |   13 | d3sf    |
+----+------+---------+
2 rows in set (0.00 sec)

mysql> select * from mytable;

+----+------+----------+
| nm | rank | id       |
+----+------+----------+
| n  |   11 | asfd     |
| n  |   11 | bsf      |
| n  |   11 | zzasdfsf |
| n  |   13 | d3sf     |
| n  |   11 | effesf   |
| n  |   10 | yxxgesf  |
| n  |   11 | bkhjusf  |
| m  |   -1 | b7kjhsf  |
| m  |   -4 | cdfgabsf |
+----+------+----------+
9 rows in set (0.00 sec)

【讨论】:

  • 这似乎可以完成工作,但我怎样才能在 select 语句中包含 ID?
  • @HassanMokdad 抱歉修复了上面的不知道你想追求 id
【解决方案2】:

正如另一个答案中提到的,我所知道的唯一其他选择是使用公用表表达式:

;WITH CTE AS
(
    T.Name,
    T.Rank,
    T.ID,
    ROW_NUMBER() OVER
       (PARTITION BY Name ORDER BY Rank DESC)
    AS RowNumber
    FROM MyTable
)

SELECT *
FROM CTE
WHERE RowNumber = 1

【讨论】:

    【解决方案3】:
    SELECT Name, Id, Rank FROM 
    (
        SELECT T.Name, T.Id, T.Rank, RANK() OVER (PARTITION BY T.Name ORDER BY T.Rank DESC) = 1 AS NameRank
        FROM MyTable T
    )
    WHERE NameRank = 1
    

    【讨论】:

      【解决方案4】:

      不确定您是否只是想排除嵌套选择,以及是否可以接受加入子选择。如果是这样:-

      SELECT
          T.Name,
          T.Rank,
          T.ID
      FROM MyTable T
      INNER JOIN (SELECT Name, MAX(Rank) AS MaxRank FROM MyTable GROUP BY Name ) T1
      ON T.Name = T1.Name
      AND T.Rank = T1.MaxRank
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2019-01-06
        • 2020-07-11
        • 1970-01-01
        • 2018-10-06
        相关资源
        最近更新 更多