6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BigQuery用SQLスニペット

Last updated at Posted at 2019-05-17

#はじめに

BigQueryでアレをする時どんなクエリを書けばいいんだっけ?ということが良くあるので、残しておきます。
StandardSQLです。
都度追記します。

公式ドキュメント

INFORMATION_SCHEMA
PARSE_DATE
DATE でサポートされる形式設定要素

スニペット

履歴 関連

クエリで特定のテーブルやカラムが使われているか調べる

SELECT
  query
FROM
  region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT -- リージョンが異なる場合は適宜変更
WHERE
  query LIKE '%XXXXX%'

テーブル定義 関連

スキーマ定義をText形式で抽出する

SELECT
  ARRAY_TO_STRING(columns, ',')
FROM (
  SELECT
    ARRAY(
    SELECT
      CONCAT(column_name, ":",
        CASE data_type
          WHEN 'INT64' THEN 'INTEGER'
          WHEN 'FLOAT64' THEN 'FLOAT'
          ELSE data_type END) AS type
    FROM
      `<dataset>.INFORMATION_SCHEMA.COLUMNS`
    WHERE
      table_name = 'all'
    ORDER BY
      ordinal_position) AS columns)

descriptionを抽出する

SELECT
  table_name,
  option_value
FROM
  `<dataset>.INFORMATION_SCHEMA.TABLE_OPTIONS`
WHERE
  option_name = 'description'

Date 関連

2015/2/6をDate型にする

WITH
  data AS (
  SELECT
    '2015/2/6' AS date1,
    '2015/02/16' AS date2,
    '15/02/16' AS date3 )
SELECT
  PARSE_DATE('%Y/%m/%d',
    date1),
  PARSE_DATE('%Y/%m/%d',
    date2),
  PARSE_DATE('%y/%m/%d',
    date3) --yは小文字
FROM
  data

Nov 26, 2018 をDate型にする

WITH
  data AS (
  SELECT
    'Nov 26, 2018' AS date1 )
SELECT
  PARSE_DATE('%b %e, %Y',
    date1)
FROM
  data

日付別テーブル 関連

最新の日付別テーブルのみ参照する

WITH
  latest AS (
    SELECT
      MAX(_TABLE_SUFFIX) AS table_suffix
    FROM
      `sandbox-suzutatsu-bq.test.sample1_*`
)
SELECT
  *
FROM
  `sandbox-suzutatsu-bq.test.sample1_*`,
  latest
WHERE
  _TABLE_SUFFIX = latest.table_suffix

日付別テーブルの日付をカラムとして持つ

SELECT
  PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) as date
FROM
  `sandbox-suzutatsu-bq.test.sample1_*`

便利クエリ 関連

クエリ履歴をクエリ費用が高い順に表示

WITH
  x AS (
  SELECT
    user_email,
    project_id,
    job_id,
    start_time,
    ROUND(total_bytes_billed / POW(1024, 3), 1) AS total_giga_bytes_billed,
    query
  FROM
    region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT
  WHERE
    total_bytes_billed IS NOT NULL
    -- AND 金額に関する条件
    -- AND 期間に関する条件
    )
SELECT
  user_email,
  project_id,
  job_id,
  DATETIME(start_time, 'Asia/Tokyo') AS datetime,
  total_giga_bytes_billed,
  query
FROM
  x
ORDER BY
  total_giga_bytes_billed DESC

ある日付の期間の分だけ行を返す

WITH base AS (
SELECT
  GENERATE_DATE_ARRAY(
    DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 2 MONTH),
    CURRENT_DATE('Asia/Tokyo'),
    INTERVAL 1 DAY) AS date_array
)
SELECT
  date_row
FROM
  base, UNNEST(date_array) AS date_row

UDF(ファンクション)関連

マスタとして用意したテーブルを使ってAをBに変換する

CREATE OR REPLACE FUNCTION func.yyyymmdd_to_yearmonth(yyyymmdd STRING)
OPTIONS (description="YYYYMMDDからマスタテーブルで変換後のXX年月を取得する")
 AS ((
    SELECT
      MAX(year_month)
    FROM
      master.xxxxx_master
    WHERE
      start_date <= PARSE_DATE('%Y%m%d', yyyymmdd)))
6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?