Sql分组并按最大字段获取行

时间:2012-05-30 13:46:54

标签: mysql sql

我有下表:

  T1 | T2 | T3
  ------------
  A  | 2  | XY
  A  | 1  | XA
  A  | 4  | XZ
  B  | 2  | XF
  C  | 3  | XA
  C  | 7  | XY
  D  | 1  | XL
  D  | 2  | XF
  E  | 3  | XA
  E  | 6  | XZ
  E  | 2  | XY
  F  | 3  | XL
  F  | 2  | XZ

我正在尝试GROUP BY T1并在相同的MAX(T2)行中获得MAX(T2)和T3;如何在没有其他选择的情况下获得它?

3 个答案:

答案 0 :(得分:3)

SELECT * FROM table outertable
INNER JOIN (
    SELECT t1, MAX(t2) as `mx` FROM table GROUP BY t1
) innertable ON outertable.t1 = innertable.t1 AND outertable.t2 = innertable.mx

答案 1 :(得分:1)

MySQL不支持分析功能(a-la Oracle或MS SQL Server),所以不幸的是你不能(没有第二次查询就这样做)。

MySQL查询看起来像这样:

SELECT *
FROM YOUR_TABLE YT1
WHERE
    EXISTS (
        SELECT T1
        FROM YOUR_TABLE YT2
        WHERE YT1.T1 = YT2.T1
        GROUP BY T1
        HAVING YT1.T2 = MAX(T2)
   );

您可以在此SQL Fiddle中使用它。

CAVEAT:MySQL并不擅长优化EXISTS。如果您的测量显示出性能问题,请将其转换为JOIN。

答案 2 :(得分:0)

WITH A AS (
  SELECT T1, MAX(T2) AS T2 FROM MyTable GROUP BY T1
)
SELECT A.T1, A.T2, B.T3
FROM A INNER JOIN MyTable AS B
  ON  B.T1 = A.T1
  AND B.T2 = A.T2

两个警告: - 是的,它有两个选择,但不要低估服务器可以优化的内容 - 我的样本假设T2在一组T1中是唯一的