1

次の表があります。

  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) と T3 を同じ MAX(T2) 行に取得しようとしています。別の選択なしでどうすればそれを取得できますか?

4

3 に答える 3

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
于 2012-05-30T14:00:55.247 に答える
1

MySQLは分析関数(a-laOracleまたはMSSQL Server)をサポートしていないため、残念ながらサポートできません(2番目のクエリなしで実行できます)。

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フィドルで遊ぶことができます。

警告:MySQLはEXISTSの最適化があまり得意ではありません。測定値にパフォーマンスの問題が見られる場合は、JOINに変換してください。

于 2012-05-30T14:03:49.237 に答える
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

2つの注意点:-はい、2つの選択がありますが、サーバーが最適化できるものを過小評価しないでください-私のサンプルでは、​​T2がT1の1つのグループ内で一意であると想定しています

于 2012-05-30T14:01:37.577 に答える