【BigQuery】DISTINCTとCOUNT関数で一意なレコードを求める方法を紹介

BigQuery_DISTINCT_COUNT関数 クラウドプラットフォーム

以前DISTINCTの使い方について紹介しました。

DISTINCTを使うと重複した値を1つにまとめられましたよね。
実務でDISTINCTを使うときはCOUNT関数と一緒に使うことが多いのではないでしょうか。

今回はより実務的なDISTINCTの使い方について紹介します。

COUNT関数とは

COUNT関数とは集約関数の1つで数を集計するときに使います。

特にレコードの数を求めたいときはこのCOUNT関数を使いますね。

DISTINCTとCOUNT関数を一緒に使う

DISTINCTとCOUNT関数を一緒に使うことで重複を省いたレコード(=一意なレコード)の数を調べられます。

セットで使うときはこのように書きます。

SELECT
  COUNT(DISTINCT カラム名)
FROM
  テーブル名

COUNT関数の中にDISTINCT カラム名を入れてあげましょう。
処理の順番は先にカラムの重複を省きます。レコードが一意になった後でレコードの数を数えるという感じです。

では実際にサンプルデータでクエリを実行してみましょう。

サンプルデータ

1週間のトレーニングデータを用意しました。
スクワットとプッシュアップが重複しているのでレコード数は7ですね。

サンプルデータを一覧出力する|クリックして拡大できます

今回は「トレーニングメニューが何種類あるか?」知りたいのでCOUNT(DISTINCT)を使って求めましょう!

COUNT DISTINCTを一緒に使う|クリックして拡大できます
SELECT
  COUNT(DISTINCT menu) AS `トレーニングメニューの数`
FROM
  `sql-book-384011.sample.20230805_training_menu_week`

トレーニングメニューはこちらの4種類なので一致していますね。

  • アブローラー
  • スクワット
  • プッシュアップ
  • ベンチプレス

たとえレコードが重複していたとしても、COUNT(DISTINCT)を使うと一意なレコード数を求められました!

補足 集計関数とDISTINCTを一緒に使うとカラム順序は関係ない

こちらの記事でよくある間違いとしてDISTINCTの前にカラムを書くとエラーになることを紹介しました。ところが集計関数と一緒に使った場合はカラムの順番でエラーはおきません。

DISTINCTよりも前にカラムを指定する|クリックして拡大できます
SELECT
  date AS `実施日`,
  COUNT(DISTINCT menu) AS `トレーニングメニューの数`
FROM
  `sql-book-384011.sample.20230805_training_menu_week`
GROUP BY
  date

これはDISTINCTの処理先がmenuカラムだけになっているからでしょう。
DISTINCT単体のときは取り出すカラムすべてに処理をしていました。そのため書く順番が関係したんですね。

DISTINCTの後にカラムを指定する|クリックして拡大できます

まとめ

今回はDISTINCTとCOUNT関数をセットに使う方法について紹介しました。
重複した数ではなく一意なレコードの数を集計する機会はよくあるでしょう。

そのときはCOUNT(DISTINCT カラム名)を使って求めてあげればOKですね!