【BigQuery】DISTINCTの使い方とは?重複排除するときの注意点を紹介

BigQuery_DISTICT クラウドプラットフォーム

複数のレコードを1つにまとめて集計したいときありますよね。
そんなときに便利なのがDISTINCT句です。

DISTINCT句を使うと複数のレコードを1つにまとめることができるので集計に役立ちます。

誤った使い方をするとうまくレコードの重複を排除できないので注意が必要です。

今回はDISTINCTの使い方とその注意点について紹介します。

DISTINCT句の使い方

DISTINCTはこのように書きます。

SELECT DISTINCT
  カラム名
FROM
  テーブル名

SELECTの後・カラム名の前にDISTINCTを書くことでカラム単位で重複を省きます。このような列(カラム)に対して処理をすることを射影と言います。

ではサンプルデータを使って重複を省いていきましょう!

サンプルデータ 〜トレーニングメニューの重複を一意にする〜

ここに1週間のトレーニングデータがあります。
スクワットとプッシュアップが重複していますね。

トレーニングメニューが重複している|クリックして拡大できます

DISTINCTを使って重複したレコードを一意にしましょう。
クエリ結果を以下のように表示したいと思います。

1アブローラー
2スクワット
3プッシュアップ
4ベンチプレス
DISTINCT句を使ってレコードを1つにまとめる

【実戦】DISTINCTを使ってレコードの重複を排除する

重複したトレーニングメニューをまとめる|クリックして拡大できます
SELECT DISTINCT
  menu AS `トレーニングメニュー`
FROM
  `sql-book-384011.sample.20230805_training_menu_week`
ORDER BY
  menu ASC

トレーニングメニューの重複が消えましたね。
レコードがすっきりとして見やすくなりました。

DISTINCT句にdateカラムも追加する

続いて、dateカラムを追加してみましょう。

DISTINCTしても一意にできない|クリックして拡大できます

DISTINCTが付いているにも関わらず同じトレーニングメニューが表示されました。

トレーニングメニューが重複して表示された原因はdateカラムにあります。
dateカラムの中身を見ると重複した日付がありません。

DISTINCT句はカラム単位で重複を排除するので、
たとえトレーニングメニューカラムに重複があっても、実施日(dateカラム)に重複がなければレコードはまとまりません。

以上の理由からレコードは重複して表示されたんですね
DISTINCTを使うときは重複を省きたいカラムだけ取り出すのが良いでしょう

DITINCT句の位置にも注意

DISTINCTを使うときによくあるミスが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を入れ替えるとクエリは実行できます。

DISTINCTはカラムの前に置く|クリックして拡大できます
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は業務で頻繁に使われるでしょう。
これを機会にマスターしましょう!