元エンジニアPMのプロダクトマネージャーお役立ち情報

プロダクトとビジネスの両輪どっちも回してる人 事業戦略やプロダクトマネジメントに関する情報を発信

【SQL】重複する結果を除外するdistinctの使い方

SQLで普段からよく使う構文に「distinct」があります。distinctは重複したカラムを1つにして抽出する際に使う構文です。
例えば、どのユーザーが何の商品を買ったかが管理されているテーブルの場合、売れた商品の一覧や、購入したユーザーだけを抽出するなどそのような際に使うことができます。 似たような構文に「group by」がありますが、distinctとgroup byの主な違いとしては、「distinctが実行した結果のテーブルから、重複している行を削除した結果を出すのに対し、group byは実行した結果をグループ化して更に集計する際に用いる。」といった差があります。

サンプルデータからdistinctの考え方を掴む

下記のように商品とユーザー別に管理されているテーブルをイメージしてください。

商品名 ユーザー名 個数 商品価格 購入日時
ノートPC 田中太郎 1 120,000 2023-10-01 10:15:00
スマートフォン 鈴木花子 2 80,000 2023-10-02 14:30:00
タブレット 田中太郎 1 50,000 2023-10-03 09:45:00
スマートフォン 山田次郎 1 80,000 2023-10-04 16:00:00
ノートPC 佐藤健 1 120,000 2023-10-05 11:20:00
ノートPC 田中太郎 2 120,000 2023-10-06 13:50:00
スマートフォン 鈴木花子 1 80,000 2023-10-07 08:30:00
タブレット 佐藤健 3 50,000 2023-10-08 15:45:00
ノートPC 山田次郎 1 120,000 2023-10-09 17:10:00
スマートフォン 田中太郎 1 80,000 2023-10-10 19:00:00

このようなテーブルがあった際、例えば購入されたユニークな商品を知りたい場合やユニークな購入者数を抽出したいなど思うことがあると思います。
そういう時に下記のようにdistinctを加えることで重複を除いてカウントできます。

-- ユニークな商品名の数を取得
SELECT COUNT(DISTINCT 商品名) AS ユニーク商品数
FROM テーブル名;

-- ユニークなユーザー名の数を取得
SELECT COUNT(DISTINCT ユーザー名) AS ユニークユーザー数
FROM テーブル名;

group byを使う場合

distinctは、あくまで単一のデータの重複を除外するのみになります。それぞれのデータに対して、何件購入されたか?のような集計をする場合はgroup byを使います。

SELECT 商品名, COUNT(*) AS 購入件数
FROM テーブル名
GROUP BY 商品名;  

以上簡単にdistinctの紹介をしてみました。普段からよく使う構文なので是非うまく使ってみてくださいね。