LAG() + CTE — 前期比成長率で競合の四半期トレンド加速・減速を可視化する
LAG(expr, offset, default) はウィンドウ関数の一種で、現在行から offset 行前の値を返します。前期比・前年同期比の計算に不可欠なパターンです。
LAG(revenue) OVER ( PARTITION BY company_name -- 企業をまたいで前行を取らない ORDER BY quarter -- 四半期順で「1行前」を確定 ) -- デフォルト offset=1, default=NULL
revenue / prev_revenue が ZeroDivisionError になります。NULLIF(prev_revenue, 0) は値が 0 のとき NULL を返すため、NULL との除算は NULL(エラーではない)として安全に処理できます。3社の四半期売上から、各社の前期売上(prev_revenue)と前期比成長率(growth_rate_pct、小数第1位)を算出してください。取得列は company_name, quarter, revenue, prev_revenue, growth_rate_pct、company_name 昇順 → quarter 昇順で返してください。prev_revenue と growth_rate_pct は NULL になります。
| company_name | quarter | revenue |
|---|---|---|
| AlphaTech | 2023Q1 | 300 |
| AlphaTech | 2023Q2 | 360 |
| AlphaTech | 2023Q3 | 280 |
| AlphaTech | 2023Q4 | 400 |
| BetaSoft | 2023Q1 | 250 |
| BetaSoft | 2023Q2 | 220 |
| BetaSoft | 2023Q3 | 290 |
| BetaSoft | 2023Q4 | 310 |
| GammaSys | 2023Q1 | 120 |
| GammaSys | 2023Q2 | 150 |
| GammaSys | 2023Q3 | 170 |
| GammaSys | 2023Q4 | 160 |
※ revenue 単位: 億円
| company_name | quarter | revenue | prev_revenue | growth_rate_pct |
|---|---|---|---|---|
| AlphaTech | 2023Q1 | 300 | NULL | NULL |
| AlphaTech | 2023Q2 | 360 | 300 | 20.0 |
| AlphaTech | 2023Q3 | 280 | 360 | -22.2 |
| AlphaTech | 2023Q4 | 400 | 280 | 42.9 |
| BetaSoft | 2023Q1 | 250 | NULL | NULL |
| BetaSoft | 2023Q2 | 220 | 250 | -12.0 |
| BetaSoft | 2023Q3 | 290 | 220 | 31.8 |
| BetaSoft | 2023Q4 | 310 | 290 | 6.9 |
| GammaSys | 2023Q1 | 120 | NULL | NULL |
| GammaSys | 2023Q2 | 150 | 120 | 25.0 |
| GammaSys | 2023Q3 | 170 | 150 | 13.3 |
| GammaSys | 2023Q4 | 160 | 170 | -5.9 |
RANK() + CTE — カテゴリ別競合ランキングと上位 N 社フィルタ
RANK() / DENSE_RANK() / ROW_NUMBER() はいずれも順位を返すウィンドウ関数ですが、同率順位の扱いが異なります。
| 関数 | 同率2位が2行ある場合 | 次の順位 |
|---|---|---|
ROW_NUMBER() | 2, 3(擬似的に一意付与) | 4 |
RANK() | 2, 2(同率) | 4(飛び番) |
DENSE_RANK() | 2, 2(同率) | 3(連番) |
WITH ranked AS ( SELECT *, RANK() OVER (PARTITION BY category ORDER BY annual_revenue DESC) AS rnk FROM product_revenue ) SELECT * FROM ranked WHERE rnk <= 2; -- 各カテゴリの上位2位以内(同率を含む)
各カテゴリの競合売上データから、カテゴリ内売上ランキング(rank_in_category)を付与し、各カテゴリの上位2位以内(同率を含む)の企業のみを抽出してください。取得列は category, company_name, annual_revenue, rank_in_category、カテゴリはAI/ML→クラウド→セキュリティ→データ分析の指定順、各カテゴリ内は rank_in_category 昇順、同順位は company_name 昇順で返してください。
| company_name | category | annual_revenue |
|---|---|---|
| AlphaTech | クラウド | 4200 |
| AlphaTech | セキュリティ | 1800 |
| AlphaTech | AI/ML | 950 |
| BetaSoft | クラウド | 2800 |
| BetaSoft | AI/ML | 1500 |
| BetaSoft | データ分析 | 800 |
| GammaSys | セキュリティ | 900 |
| GammaSys | AI/ML | 650 |
| GammaSys | データ分析 | 420 |
| DeltaNet | クラウド | 1200 |
| DeltaNet | データ分析 | 600 |
※ annual_revenue 単位: 億円
| category | company_name | annual_revenue | rank_in_category |
|---|---|---|---|
| AI/ML | BetaSoft | 1500 | 1 |
| AI/ML | AlphaTech | 950 | 2 |
| クラウド | AlphaTech | 4200 | 1 |
| クラウド | BetaSoft | 2800 | 2 |
| セキュリティ | AlphaTech | 1800 | 1 |
| セキュリティ | GammaSys | 900 | 2 |
| データ分析 | BetaSoft | 800 | 1 |
| データ分析 | DeltaNet | 600 | 2 |
複数 CTE スコアリング — 段階的集計で競合の総合 KPI 評価グレードを自動算出する
複数の CTE は WITH 句の中にカンマで連結して定義でき、前段の CTE を後段の CTE で参照できます。複雑な集計を段階的に分解し、各ステップを名前付きで可読化できます。
WITH step1 AS ( SELECT ..., CASE WHEN col >= 30 THEN 3 ELSE 1 END AS score FROM source_table ), step2 AS ( -- step1 を参照可能 SELECT *, score_a + score_b AS total FROM step1 ) SELECT * FROM step2;
CASE WHEN ... END で ELSE を省略すると ELSE NULL になります。スコアリングでは必ず ELSE 最低点 を明示してください。6社の競合 KPI データから、売上規模・成長率・NPS それぞれを 1〜3 点でスコアリングし、合計点(最大9点)と総合グレード(S/A/B/C)を算出してください。取得列は company_name, revenue_score, growth_score, nps_pts, total_score, grade、total_score 降順 → company_name 昇順で返してください。
スコア基準:revenue_score(revenue_bn ≥30→3, ≥10→2, else 1)|growth_score(growth_pct ≥25→3, ≥10→2, else 1)|nps_pts(nps_score ≥65→3, ≥50→2, else 1)|grade(total ≥8→S, ≥6→A, ≥4→B, else C)
| company_name | revenue_bn | growth_pct | nps_score |
|---|---|---|---|
| AlphaTech | 42.0 | 18.5 | 72 |
| BetaSoft | 28.0 | 12.3 | 58 |
| GammaSys | 15.0 | 31.2 | 65 |
| DeltaNet | 5.0 | 8.1 | 48 |
| EpsilonSys | 3.0 | -2.4 | 41 |
| ZetaCloud | 2.0 | 5.6 | 55 |
※ revenue_bn: 売上(十億円)/ growth_pct: 前年成長率(%)/ nps_score: 顧客NPS
| company_name | revenue_score | growth_score | nps_pts | total_score | grade |
|---|---|---|---|---|---|
| AlphaTech | 3 | 2 | 3 | 8 | S |
| GammaSys | 2 | 3 | 3 | 8 | S |
| BetaSoft | 2 | 2 | 2 | 6 | A |
| ZetaCloud | 1 | 1 | 2 | 4 | B |
| DeltaNet | 1 | 1 | 1 | 3 | C |
| EpsilonSys | 1 | 1 | 1 | 3 | C |
CASE WHEN ピボット — 縦持ち四半期売上を横持ちに変換し年内成長率を算出する
条件付き集計(Conditional Aggregation)は SUM(CASE WHEN ... END) パターンで縦持ち(行方向)データを横持ち(列方向)に変換します。PostgreSQL には専用の PIVOT 構文がないため、このパターンが標準的な実装です。
SELECT company_name, SUM(CASE WHEN quarter = 'Q1' THEN revenue ELSE 0 END) AS q1_rev, SUM(CASE WHEN quarter = 'Q2' THEN revenue ELSE 0 END) AS q2_rev FROM quarterly_sales GROUP BY company_name;
ELSE 0 は対象外の行を 0 として合計します。ELSE NULL にすると SUM は NULL を無視するため結果は同じですが、AVG や COUNT に影響が出ます。ピボット集計では慣習的に ELSE 0 が使われます。3社の2024年四半期売上から、四半期別売上(第1〜第4四半期)を横持ちに変換し、年間合計(annual_total)と 第1四半期→第4四半期の年内成長率(q4_vs_q1_pct、小数第1位)を算出してください。取得列は company_name, q1_rev, q2_rev, q3_rev, q4_rev, annual_total, q4_vs_q1_pct、annual_total 降順で返してください。
| company_name | year | quarter | revenue |
|---|---|---|---|
| AlphaTech | 2024 | Q1 | 340 |
| AlphaTech | 2024 | Q2 | 410 |
| AlphaTech | 2024 | Q3 | 320 |
| AlphaTech | 2024 | Q4 | 450 |
| BetaSoft | 2024 | Q1 | 260 |
| BetaSoft | 2024 | Q2 | 240 |
| BetaSoft | 2024 | Q3 | 310 |
| BetaSoft | 2024 | Q4 | 340 |
| GammaSys | 2024 | Q1 | 130 |
| GammaSys | 2024 | Q2 | 165 |
| GammaSys | 2024 | Q3 | 185 |
| GammaSys | 2024 | Q4 | 170 |
※ revenue 単位: 億円
| company_name | q1_rev | q2_rev | q3_rev | q4_rev | annual_total | q4_vs_q1_pct |
|---|---|---|---|---|---|---|
| AlphaTech | 340 | 410 | 320 | 450 | 1520 | 32.4 |
| BetaSoft | 260 | 240 | 310 | 340 | 1150 | 30.8 |
| GammaSys | 130 | 165 | 185 | 170 | 650 | 30.8 |
PERCENT_RANK() + LAG() + 2段 CTE — 競合の相対ポジション変化を年次追跡する
PERCENT_RANK() は各行の相対的な順位をパーセンタイル(0.0〜1.0)で返します。計算式は (rank - 1) / (total_rows - 1) です。
| 計算式 | 5行の例(ORDER BY revenue ASC) |
|---|---|
(rank-1) / (5-1) | 最小売上=0.0 / 中位=0.5 / 最大売上=1.0 |
PERCENT_RANK() OVER ( PARTITION BY year -- 年度ごとに独立した順位空間 ORDER BY revenue_bn -- 小さい順→0.0、大きい順→1.0 ) * 100 -- 百分率(0〜100)に変換
5社の2年分の売上データから、年度内での相対売上ポジション(pct_rank、小数第1位・百分率)と前年比ポジション変化(pct_rank_change)を算出してください。取得列は company_name, year, revenue_bn, pct_rank, prev_pct_rank, pct_rank_change、year 昇順 → pct_rank 降順で返してください。
| company_name | year | revenue_bn |
|---|---|---|
| AlphaTech | 2022 | 35.0 |
| BetaSoft | 2022 | 26.0 |
| GammaSys | 2022 | 18.0 |
| DeltaNet | 2022 | 12.0 |
| EpsilonSys | 2022 | 7.0 |
| AlphaTech | 2023 | 42.0 |
| BetaSoft | 2023 | 28.0 |
| GammaSys | 2023 | 15.0 |
| DeltaNet | 2023 | 16.0 |
| EpsilonSys | 2023 | 9.0 |
| company_name | year | revenue_bn | pct_rank | prev_pct_rank | pct_rank_change |
|---|---|---|---|---|---|
| AlphaTech | 2022 | 35.0 | 100.0 | NULL | NULL |
| BetaSoft | 2022 | 26.0 | 75.0 | NULL | NULL |
| GammaSys | 2022 | 18.0 | 50.0 | NULL | NULL |
| DeltaNet | 2022 | 12.0 | 25.0 | NULL | NULL |
| EpsilonSys | 2022 | 7.0 | 0.0 | NULL | NULL |
| AlphaTech | 2023 | 42.0 | 100.0 | 100.0 | 0.0 |
| BetaSoft | 2023 | 28.0 | 75.0 | 75.0 | 0.0 |
| DeltaNet | 2023 | 16.0 | 50.0 | 25.0 | 25.0 |
| GammaSys | 2023 | 15.0 | 25.0 | 50.0 | -25.0 |
| EpsilonSys | 2023 | 9.0 | 0.0 | 0.0 | 0.0 |