1. ホーム
  2. sql

[解決済み] 異なる行を選択しながら、1つのフィールドの最小値でグループ化する

2023-06-15 04:40:26

質問

私がやろうとしていることは、次のようなことです。例えば、このテーブルtがあるとします。

key_id | id | record_date | other_cols
1      | 18 | 2011-04-03  | x
2      | 18 | 2012-05-19  | y
3      | 18 | 2012-08-09  | z
4      | 19 | 2009-06-01  | a
5      | 19 | 2011-04-03  | b
6      | 19 | 2011-10-25  | c
7      | 19 | 2012-08-09  | d

各IDについて、最小のrecord_dateを含む行を選択したいと思います。だから、私は得るでしょう。

key_id | id | record_date | other_cols
1      | 18 | 2011-04-03  | x
4      | 19 | 2009-06-01  | a

この問題に対する唯一の解決策は、すべてのrecord_dateエントリが明確であることを前提としていますが、私のデータではそのようなことはありません。サブクエリと2つの条件による内部結合を使用すると、いくつかのIDについて重複した行が生成されることになりますが、これは望ましくありません。

key_id | id | record_date | other_cols
1      | 18 | 2011-04-03  | x
5      | 19 | 2011-04-03  | b
4      | 19 | 2009-06-01  | a

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

のようなものはいかがでしょうか。

SELECT mt.*     
FROM MyTable mt INNER JOIN
    (
        SELECT id, MIN(record_date) AS MinDate
        FROM MyTable
        GROUP BY id
    ) t ON mt.id = t.id AND mt.record_date = t.MinDate

これは、IDごとに最小の日付を取得し、その値に基づいて値を取得します。重複が発生するのは、同じIDの最小記録日が重複している場合のみです。