MariaDBで重複レコードを処理する3つの秘訣:1つの列に基づいて最初の行を取得する方法
MariaDBで重複レコードから最初の行を1つの列に基づいて取得する方法
使用するツール
- MariaDB 10.5
- SQL クエリ
前提条件
- 対象テーブルには、重複を判断するための列が含まれている必要があります。
- 必要に応じて、MariaDBサーバーに接続していることを確認してください。
手順
- DISTINCTキーワードを使用する
SELECT DISTINCT your_column, *
FROM your_table;
このクエリは、your_column
列のすべての個別値を選択します。重複する行は削除されます。
- GROUP BY句を使用する
SELECT your_column, MIN(your_other_column) AS other_column_value
FROM your_table
GROUP BY your_column;
このクエリは、your_column
列の各値に対して、your_other_column
列の最小値を選択します。つまり、各重複グループの最初の行が選択されます。
- ROW_NUMBER()ウィンドウ関数を使用する
SELECT your_column, *
FROM (
SELECT your_column,
your_other_column,
ROW_NUMBER() OVER (PARTITION BY your_column ORDER BY your_other_column) AS row_number
FROM your_table
) AS tmp
WHERE row_number = 1;
このクエリは、your_column
列ごとにパーティション化されたウィンドウ内で、your_other_column
列に基づいて行に番号を付けます。次に、row_number
が1である行のみを選択します。つまり、各重複グループの最初の行が選択されます。
例
次のテーブルがあると仮定します。
| id | name | email |
|---|---|---|
| 1 | John Doe | [email protected] |
| 2 | Jane Doe | [email protected] |
| 3 | John Doe | [email protected] |
| 4 | Jane Doe | [email protected] |
上記のクエリを実行すると、次の結果が得られます。
| id | name | email |
|---|---|---|
| 1 | John Doe | [email protected] |
| 2 | Jane Doe | [email protected] |
説明
- 上記の例では、
id
列が重複を判断するための列として使用されています。 DISTINCT
キーワードは、your_column
列の個別値のみを選択するため、重複する行は削除されます。GROUP BY
句は、your_column
列の各値に対して集計を実行し、your_other_column
列の最小値を選択します。ROW_NUMBER()
ウィンドウ関数は、your_column
列ごとにパーティション化されたウィンドウ内で、your_other_column
列に基づいて行に番号を付けます。
ヒント
- 必要に応じて、
ORDER BY
句を使用して、選択された行のソート順序を変更できます。 WHERE
句を使用して、選択された行をさらにフィルタリングできます。
SELECT DISTINCT city, *
FROM customers;
*
ワイルドカードは、選択された行のすべての列を取得します。
出力
city | customer_id | name | email | phone
-----+------------+--------------+--------------------+-----------------
New York | 1 | John Doe | [email protected] | 123-456-7890
San Francisco | 2 | Jane Doe | [email protected] | 987-654-3210
Boston | 3 | Peter Jones | [email protected] | 456-789-0123
- このクエリは、
city
列に基づいて重複レコードを削除する最も基本的な方法です。 GROUP BY
句やROW_NUMBER()
ウィンドウ関数を使用して、より複雑な方法で重複レコードを処理することもできます。
この方法は、MIN()
関数を使用して your_other_column
列の最小値を取得し、SUBSTRING_INDEX()
関数を使用して対応する your_column
値を抽出します。
SELECT your_column,
SUBSTRING_INDEX(GROUP_CONCAT(your_other_column ORDER BY your_other_column ASC), ',', 1) AS other_column_value
FROM your_table
GROUP BY your_column;
説明:
- このクエリは、
your_column
列の各値に対して、your_other_column
列の値をカンマ区切り文字列として連結します。 ORDER BY your_other_column ASC
句は、連結された文字列内の値を昇順にソートします。SUBSTRING_INDEX()
関数は、連結された文字列から最初のカンマで区切られた部分文字列を抽出し、your_other_column
列の最小値に対応するyour_column
値を返します。
CTE (Common Table Expression) を使用する
この方法は、CTEを使用して your_column
列の各値に対する your_other_column
列の最小値を計算し、その結果を使用して最初の行を取得します。
WITH cte AS (
SELECT your_column,
MIN(your_other_column) AS min_other_column
FROM your_table
GROUP BY your_column
)
SELECT your_column, *
FROM your_table t
JOIN cte ON t.your_column = cte.your_column AND t.your_other_column = cte.min_other_column;
- このクエリは、
cte
という名前のCTEを作成します。 - 外部クエリは、
your_table
テーブルとcte
を結合し、your_column
とyour_other_column
列が一致する行のみを選択します。
mysql sql mariadb