1. ホーム
  2. mysql

MySQL で各グループの最初の行を選択する方法は?

2023-09-18 09:04:04

質問

C#ではこのようになります。

table
   .GroupBy(row => row.SomeColumn)
   .Select(group => group
       .OrderBy(row => row.AnotherColumn)
       .First()
   )

Linq-To-Sqlはこれを以下のようなT-SQLのコードに変換します。

SELECT [t3].[AnotherColumn], [t3].[SomeColumn]
FROM (
    SELECT [t0].[SomeColumn]
    FROM [Table] AS [t0]
    GROUP BY [t0].[SomeColumn]
    ) AS [t1]
OUTER APPLY (
    SELECT TOP (1) [t2].[AnotherColumn], [t2].[SomeColumn]
    FROM [Table] AS [t2]
    WHERE (([t1].[SomeColumn] IS NULL) AND ([t2].[SomeColumn] IS NULL))
      OR (([t1].[SomeColumn] IS NOT NULL) AND ([t2].[SomeColumn] IS NOT NULL)
        AND ([t1].[SomeColumn] = [t2].[SomeColumn]))
    ORDER BY [t2].[AnotherColumn]
    ) AS [t3]
ORDER BY [t3].[AnotherColumn]

しかし、MySQLとは互換性がありません。

どのように解決するのですか?

と書くと

SELECT AnotherColumn
FROM Table
GROUP BY SomeColumn
;

うまくいきました。他の RDBMS では、グループ化キーに属さないカラムが何らかの集約を行わずに参照されるため、このようなステートメントは不可能だと思われます。

この "quirk" は、私が欲しいものに非常に近い振る舞いをします。そのため、私はそれを使用して、私が望む結果を得ました。

SELECT * FROM 
(
 SELECT * FROM `table`
 ORDER BY AnotherColumn
) t1
GROUP BY SomeColumn
;