0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BigQuery SQL cheat sheet

Posted at

1. 基本クエリ

テーブルから特定の列を選択し、条件に基づいてフィルタリングし、ソートして結果を制限

SELECT column1, column2
FROM dataset.table
WHERE condition
ORDER BY column
LIMIT 10;

2. 集計関数

集計関数を使用して列の数、合計、平均、最小値、最大値を取得

SELECT
  COUNT(column) AS count_column,  -- 列の行数をカウント
  SUM(column) AS sum_column,      -- 列の合計を計算
  AVG(column) AS avg_column,      -- 列の平均値を計算
  MIN(column) AS min_column,      -- 列の最小値を取得
  MAX(column) AS max_column       -- 列の最大値を取得
FROM dataset.table
WHERE condition;

3. GROUP BY と HAVING

列でグループ化し、グループごとに行数をカウントし、特定の条件を満たすグループをフィルタリング

SELECT
  column,
  COUNT(*) AS count
FROM dataset.table
GROUP BY column
HAVING count > 1;  -- 行数が1を超えるグループのみを表示

4. JOIN

INNER JOIN: 共通の列を基に2つのテーブルを結合
LEFT JOIN: 左側のテーブルのすべての行と、共通の列が一致する右側のテーブルの行を結合

-- INNER JOIN
SELECT
  a.column1,
  b.column2
FROM dataset.table1 AS a
INNER JOIN dataset.table2 AS b
ON a.common_column = b.common_column;

-- LEFT JOIN:
SELECT
  a.column1,
  b.column2
FROM dataset.table1 AS a
LEFT JOIN dataset.table2 AS b
ON a.common_column = b.common_column;

5. サブクエリ

サブクエリを使用してメインクエリ内で他のクエリ結果を取得

SELECT
  column1,
  (SELECT MAX(column2) FROM dataset.table2 WHERE condition) AS max_column2
FROM dataset.table1
WHERE condition;

6. ウィンドウ関数

ウィンドウ関数を使用してグループ内での行数を計算

SELECT
  column,
  COUNT(*) OVER(PARTITION BY column ORDER BY column2) AS count_column
FROM dataset.table;

7. 日付関数

日付関数を使用して現在の日付、日付の加算・減算、日付の差を取得

SELECT
  CURRENT_DATE() AS current_date,  -- 現在の日付を取得
  DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY) AS next_day,  -- 現在の日付に1日を加算
  DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) AS previous_day,  -- 現在の日付から1日を減算
  DATE_DIFF(CURRENT_DATE(), DATE '2023-01-01', DAY) AS days_diff;  -- 指定日付との日数の差を計算

8. 配列操作

配列の生成と操作

SELECT
  [1, 2, 3] AS array_example,  -- 配列を生成
  ARRAY_LENGTH([1, 2, 3]) AS array_length,  -- 配列の長さを取得
  ARRAY_TO_STRING([1, 2, 3], ', ') AS array_string;  -- 配列を文字列に変換

9. CASE文

CASE文を使用して条件に基づいて異なる結果を返す

SELECT
  column,
  CASE
    WHEN condition1 THEN 'Result1'  -- condition1が真の場合
    WHEN condition2 THEN 'Result2'  -- condition2が真の場合
    ELSE 'Result3'  -- 上記の条件に一致しない場合
  END AS case_result
FROM dataset.table;

10. 正規表現

正規表現を使用して列の内容を検索、抽出、置換

SELECT
  column,
  REGEXP_CONTAINS(column, r'pattern') AS contains_pattern,  -- パターンが含まれているかを確認
  REGEXP_EXTRACT(column, r'pattern') AS extract_pattern,  -- パターンに一致する部分を抽出
  REGEXP_REPLACE(column, r'pattern', 'replacement') AS replace_pattern  -- パターンに一致する部分を置換
FROM dataset.table;

11. CTE (Common Table Expressions)

WITH句を使用して複数のCTEを定義し、クエリ内で再利用

WITH CTE1 AS (
  SELECT column1, column2
  FROM dataset.table1
  WHERE condition
),
CTE2 AS (
  SELECT column3, column4
  FROM dataset.table2
  WHERE condition
)
SELECT
  CTE1.column1,
  CTE2.column3
FROM CTE1
JOIN CTE2 ON CTE1.column2 = CTE2.column4;

12. ウィンドウ関数の応用

複雑なウィンドウ関数を使用して、前後の値やランクを計算

SELECT
  column,
  LAG(column) OVER (PARTITION BY partition_column ORDER BY order_column) AS lag_column,  -- 前の行の値
  LEAD(column) OVER (PARTITION BY partition_column ORDER BY order_column) AS lead_column,  -- 次の行の値
  ROW_NUMBER() OVER (PARTITION BY partition_column ORDER BY order_column) AS row_number,  -- 行番号
  RANK() OVER (PARTITION BY partition_column ORDER BY order_column) AS rank  -- ランク
FROM dataset.table;

13. レコード操作

STRUCT型とREPEATEDフィールドを使用して複雑なデータを操作

SELECT
  STRUCT(column1, column2) AS struct_example,  -- STRUCT型のフィールドを作成
  ARRAY(SELECT AS STRUCT column3, column4 FROM dataset.table2) AS repeated_example  -- REPEATEDフィールドを作成
FROM dataset.table1;

14. JSON操作

JSON_EXTRACT, JSON_EXTRACT_SCALARを使用してJSONデータを操作

SELECT
  JSON_EXTRACT(json_column, '$.field') AS json_field,  -- JSONフィールドを抽出
  JSON_EXTRACT_SCALAR(json_column, '$.field') AS json_field_scalar  -- JSONフィールドをスカラー値として抽出
FROM dataset.table;

15. 窓枠集計

窓枠集計を使用して移動平均などを計算

SELECT
  column,
  SUM(column) OVER w AS sum_column,  -- 窓枠内の合計を計算
  AVG(column) OVER w AS avg_column  -- 窓枠内の平均を計算
FROM dataset.table
WINDOW w AS (PARTITION BY partition_column ORDER BY order_column ROWS BETWEEN 2 PRECEDING AND CURRENT ROW);  -- 窓枠を定義

16. 時系列分析

時系列データを操作して移動平均や前後の値を取得

SELECT
  timestamp_column,
  column,
  LAG(column) OVER (ORDER BY timestamp_column) AS previous_value,  -- 前の時点の値
  LEAD(column) OVER (ORDER BY timestamp_column) AS next_value,  -- 次の時点の値
  AVG(column) OVER (ORDER BY timestamp_column ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS moving_avg  -- 移動平均
FROM dataset.table;

17. パーティショニングとクラスタリング

パーティショニングとクラスタリングを使用してテーブルを効率化

CREATE TABLE dataset.partitioned_table
PARTITION BY DATE(timestamp_column)  -- 日付でパーティション分割
CLUSTER BY column1, column2 AS  -- クラスタリングキーを指定
SELECT * FROM dataset.original_table;

-- パーティションテーブルのクエリ
SELECT *
FROM dataset.partitioned_table
WHERE _PARTITIONDATE = '2024-01-01';  -- 特定のパーティションの日付をフィルタリング

18. User-Defined Functions (UDFs)

JavaScriptを使用してカスタム関数を定義し、クエリで使用

CREATE TEMP FUNCTION custom_function(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
  return x * y;
""";

SELECT
  column1,
  custom_function(column1, column2) AS custom_result  -- カスタム関数を使用
FROM dataset.table;

19. ML (Machine Learning)

BigQuery MLを使用してモデルを作成し、予測を実行

CREATE OR REPLACE MODEL dataset.model_name
OPTIONS(model_type='linear_reg', input_label_cols=['label_column']) AS  -- 線形回帰モデルを作成
SELECT * FROM dataset.training_data;

-- 予測の実行
SELECT
  *
FROM
  ML.PREDICT(MODEL dataset.model_name, (SELECT * FROM dataset.new_data));  -- 新しいデータに対して予測を実行

20. メタデータ関数

テーブルのメタデータを取得

SELECT
  table_catalog,
  table_schema,
  table_name,
  column_name,
  data_type
FROM dataset.INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name';

-- テーブルサイズの取得
SELECT
  table_id,
  row_count,
  size_bytes
FROM dataset.__TABLES__
WHERE table_id = 'table_name';
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?