WEB問題集
売上テーブル sales(order_id, customer_id, amount, ordered_at) から、顧客ごとに最新の注文 1 件を取得したいと考えています。BigQuery で最も簡潔に書けるクエリはどれですか。
正解:D
正解の根拠
QUALIFY 句はウィンドウ関数の結果に対して直接フィルタを適用できる BigQuery の構文で、サブクエリを使わずに「グループごとの最新 1 件」を取得できます。
| 句 | 役割 |
|---|---|
| PARTITION BY customer_id | 顧客単位で番号付け |
| ORDER BY ordered_at DESC | 新しい順 |
| QUALIFY = 1 | 各グループの先頭のみ抽出 |
不正解の理由
- B: GROUP BY だけでは行全体を取得できません。
- C: 全体で 1 件しか返りません。
- A: スカラー サブクエリが複数行を返しエラーになります。
参考:QUALIFY 句
BigQuery で日次売上テーブルから前日比 (今日 - 前日) を求めたいです。最も適切な関数はどれですか。
正解:D
正解の根拠
LAG は同じパーティション内で 1 つ前の行の値を返すウィンドウ関数で、前日比の計算に最適です。amount - LAG(amount) OVER (ORDER BY day) のように記述します。
| 関数 | 動き |
|---|---|
| LAG | 前の行を参照 |
| LEAD | 後の行を参照 |
| RANK | 順位付け |
| FIRST_VALUE | パーティション先頭値 |
不正解の理由
- B: 翌日の値を参照するため前日比には不適です。
- C: 順位を返すだけです。
- A: 期間先頭の値を返します。
参考:ナビゲーション関数
クエリ内で複数の中間結果を読みやすく組み立てたいです。BigQuery で再利用可能な名前付き一時結果セットを定義する標準 SQL の構文はどれですか。
正解:B
正解の根拠
WITH 句 (Common Table Expression, CTE) はクエリ内で名前付きの一時結果を定義でき、SELECT 文から複数回参照できます。可読性とメンテナンス性が高い手法です。
| 方法 | 用途 |
|---|---|
| WITH (CTE) | 同一クエリ内の中間結果 |
| TEMP TABLE | セッション内で複数クエリ共有 |
| ビュー | 永続的な再利用 |
不正解の理由
- A: 毎回作成はオーバーヘッドが大きいです。
- C: ビューは永続オブジェクトで一時用途に過剰です。
- D: BigQuery にはセッション変数の概念がそうした用途で標準化されていません。
参考:WITH 句
JSON 文字列カラム payload から特定のスカラー値 (例: ユーザー名) を取り出したいです。BigQuery で文字列として安全に取得するのに最も適した関数はどれですか。
正解:A
正解の根拠
JSON_VALUE はスカラー値を STRING として返す関数で、ユーザー名などの単一値の抽出に最適です。引用符が外された素のテキストを得られます。
| 関数 | 戻り値 |
|---|---|
| JSON_VALUE | スカラー (STRING) |
| JSON_QUERY | JSON 部分木 (STRING) |
| PARSE_JSON | JSON 型 |
不正解の理由
- B: JSON_QUERY はオブジェクトや配列の取得用です。
- C: JSON 全体を文字列化するだけです。
- D: 解析するだけでパスは指定できません。
参考:JSON 関数
JSON カラムからオブジェクト全体を JSON 形式のまま取り出す関数として最も適切なのはどれですか。
正解:D
正解の根拠
JSON_QUERY はオブジェクトや配列など JSON 構造を JSON 表現の文字列として返します。ネストされた構造を維持したい場合に使用します。
| 関数 | 典型用途 |
|---|---|
| JSON_QUERY | オブジェクト/配列抽出 |
| JSON_VALUE | スカラー抽出 |
| JSON_TYPE | 型判定 |
不正解の理由
- B: スカラーしか返せません。
- C: 型を返すだけです。
- A: キャストでは構造抽出はできません。
参考:JSON_QUERY
