SQLでの0埋め(ゼロパディング)について詳しく解説します。基本的な方法から応用テクニック、各データベースでの違いまで幅広くカバー。あなたのSQLスキルを次のレベルに引き上げる秘訣とは?
SQLで縦持ちから横持ちへデータ変換する方法とパフォーマンス最適化
SQLでデータ構造を変換する際の実践的な手法とパフォーマンスへの影響について解説します。縦持ちと横持ちのメリット・デメリットを理解し、最適な変換方法とは?
縦持ちデータを横持ちに変換する基本的なSQLの書き方を見ていきましょう。最も一般的な方法は、CASE式とMAX関数を組み合わせる方法です。
SELECT
name,
MAX(CASE WHEN subject = '数学' THEN score END) as math_score,
MAX(CASE WHEN subject = '国語' THEN score END) as japanese_score,
MAX(CASE WHEN subject = '英語' THEN score END) as english_score
FROM scores
GROUP BY name
このクエリでは、GROUP BY句でグループ化し、CASE式で条件分岐を行い、MAX関数で値を取得します。
データ構造の選択は、クエリのパフォーマンスに大きな影響を与えます。特に以下の場合は縦持ちが有利です:
実際のパフォーマンス比較では、縦持ちデータ構造の方が約14倍高速なケースも報告されています。
大規模データを扱う際は、以下の点に注意が必要です:
WITH base_data AS (
SELECT
row_id,
column_id,
value
FROM vertical_table
WHERE created_at > CURRENT_DATE - 30
)
SELECT
row_id,
MAX(CASE WHEN column_id = 1 THEN value END) as col1,
MAX(CASE WHEN column_id = 2 THEN value END) as col2
FROM base_data
GROUP BY row_id
このアプローチでは、WITH句を使用してデータを事前にフィルタリングし、メモリ使用量を抑えています。
Snowflakeなどの列指向データベースでは、縦持ちデータ構造が特に効果的です。その理由は:
動的にカラムを生成する必要がある場合は、以下のようなアプローチが有効です:
SELECT
dt,
string_agg(
CASE
WHEN metric_type = 'impression' THEN value::text
END,
',' ORDER BY created_at DESC
) as impressions,
string_agg(
CASE
WHEN metric_type = 'click' THEN value::text
END,
',' ORDER BY created_at DESC
) as clicks
FROM metrics
GROUP BY dt
このテクニックでは、string_agg関数を使用して動的に列を生成します。