複数のレコードを1つにまとめて集計したいときありますよね。
そんなときに便利なのがDISTINCT句です。
DISTINCT句を使うと複数のレコードを1つにまとめることができるので集計に役立ちます。
誤った使い方をするとうまくレコードの重複を排除できないので注意が必要です。
今回はDISTINCTの使い方とその注意点について紹介します。
DISTINCT句の使い方
DISTINCTはこのように書きます。
SELECT DISTINCT
カラム名
FROM
テーブル名
SELECTの後・カラム名の前にDISTINCTを書くことでカラム単位で重複を省きます。このような列(カラム)に対して処理をすることを射影と言います。
ではサンプルデータを使って重複を省いていきましょう!
サンプルデータ 〜トレーニングメニューの重複を一意にする〜
ここに1週間のトレーニングデータがあります。
スクワットとプッシュアップが重複していますね。
DISTINCTを使って重複したレコードを一意にしましょう。
クエリ結果を以下のように表示したいと思います。
1 | アブローラー |
2 | スクワット |
3 | プッシュアップ |
4 | ベンチプレス |
【実戦】DISTINCTを使ってレコードの重複を排除する
SELECT DISTINCT
menu AS `トレーニングメニュー`
FROM
`sql-book-384011.sample.20230805_training_menu_week`
ORDER BY
menu ASC
トレーニングメニューの重複が消えましたね。
レコードがすっきりとして見やすくなりました。
DISTINCT句にdateカラムも追加する
続いて、dateカラムを追加してみましょう。
DISTINCTが付いているにも関わらず同じトレーニングメニューが表示されました。
トレーニングメニューが重複して表示された原因はdateカラムにあります。
dateカラムの中身を見ると重複した日付がありません。
DISTINCT句はカラム単位で重複を排除するので、
たとえトレーニングメニューカラムに重複があっても、実施日(dateカラム)に重複がなければレコードはまとまりません。
以上の理由からレコードは重複して表示されたんですね
DISTINCTを使うときは重複を省きたいカラムだけ取り出すのが良いでしょう。
DITINCT句の位置にも注意
DISTINCTを使うときによくあるミスがDISTINCTの前にカラムを書いてしまうことです。
SELECT
date AS `実施日`,
DISTINCT menu AS `トレーニングメニュー`
FROM
`sql-book-384011.sample.20230805_training_menu_week`
ORDER BY
menu ASC
DISTINCTは取り出すカラムすべてを重複します。
menuカラムだけ重複を省きたいときは取り出すカラムはmenuカラムだけにしなくてはなりません。
DISTINCTの後にカラムがあればよいのでdateとmenuを入れ替えるとクエリは実行できます。
SELECT
DISTINCT menu AS `トレーニングメニュー`,
date AS `実施日`
FROM
`sql-book-384011.sample.20230805_training_menu_week`
ORDER BY
menu ASC
menuの前にDISTINCTを書くとmenuだけ重複を省いているかと思うかもしれませんが、実際はdateにも重複排除をしているので、紛らわしくないようにDISTINCTの後は改行するのがおすすめです!
まとめ
DISTINCTの使い方とよくあるミスを紹介しました。一意なレコードにしたいときに便利ですね!
よくあるミスは私も以前詰まったので紹介しました。DISTINCTの後に置いたカラムだけに重複排除をしていると勘違いしていましたね。それから書き方を見直しDISTINCTの後は改行するようになりました。
DISTINCTは業務で頻繁に使われるでしょう。
これを機会にマスターしましょう!