📈

Amazon Redshift で押さえておきたいウィンドウ関数3選

に公開

Overview

Amazon Redshift のウィンドウ関数は、集計以上の柔軟なデータ分析を可能にしてくれます。本記事では、その中でも特に頻繁に使われる3つの関数――ROW_NUMBERLISTAGGMEDIAN――に絞って解説します。実際の業務で「あれ?どう書くんだっけ…?」となったときにも、さっと引けるリファレンスとしてお役立てしてみてください!

1. ROW_NUMBER(): 行に一意の連番を付与

ROW_NUMBER()は、指定した並び順に従って各行に連続した番号(1, 2, 3…)を振り分けます。

-- user_id: ユーザーID(例: 1001, 1002)
-- login_time: ログイン日時(例: '2025-06-08 09:15:00')
SELECT
  user_id,
  login_time,
  ROW_NUMBER() OVER (
    PARTITION BY user_id        -- ユーザーごとに
    ORDER BY login_time DESC    -- 最新ログイン順に
  ) AS rn
FROM user_logins;

Input

user_id login_time
1001 2025-06-08 09:15:00
1001 2025-06-07 18:00:00
1002 2025-06-08 10:00:00
1003 2025-06-07 12:30:00
1003 2025-06-06 08:00:00

Output

user_id login_time rn
1001 2025-06-08 09:15:00 1
1001 2025-06-07 18:00:00 2
1002 2025-06-08 10:00:00 1
1003 2025-06-07 12:30:00 1
1003 2025-06-06 08:00:00 2

📖使いどころ

  • 各ユーザーの最新ログインだけを抽出したい
  • ページング用に「何番目の行か」を知りたい

💡ポイント

  • PARTITION BY で仕切り、ORDER BY で並び順を指定します
  • 必ず OVER (…) がセットです

2. LISTAGG(): 文字列をまとめて一行に

LISTAGG(expr, ',')は、グループごとに文字列を区切り文字付きで連結します。

-- room_id: チャット部屋ID(例: 101, 102)
-- username: ユーザー名(例: 'tanaka', 'suzuki')
SELECT
  room_id,
  LISTAGG(username, '、') WITHIN GROUP (ORDER BY username) OVER (
    PARTITION BY room_id      -- 部屋ごとにまとめる
  ) AS members
FROM chat_participants;

Input

room_id username
101 tanaka
101 suzuki
102 ichiro
102 hanako
103 yamada
103 sato
103 nakamura

Output

room_id members
101 tanaka、suzuki
102 hanako、ichiro
103 nakamura、sato、yamada

📖使いどころ

  • 部署ごとのメンバー一覧を一行で取得
  • 商品タグの一覧化

💡ポイント

  • 区切り文字は好みで変更可能(カンマ、スペース、日本語の「、」…)
  • WITHIN GROUP (ORDER BY …) で並びもコントロールできます

3. MEDIAN(): 中央値でばらつきを見る

MEDIAN(expr)は、ウィンドウ内の値をソートして中央値を返します。

-- dept: 部署名(例: '営業', '開発')
-- sales: 売上金額(例: 120000)
SELECT
  dept,
  MEDIAN(sales) OVER (
    PARTITION BY dept        -- 部署ごとに中央値を
  ) AS sales_median
FROM sales_table;

Input

dept sales
営業 100000
営業 200000
営業 150000
開発 300000
開発 100000
総務 120000
総務 180000

Output

dept sales_median
営業 150000
開発 200000
総務 150000

📖使いどころ

  • 平均値だけでは偏りがわかりにくいときの補完指標
  • 異常値に影響されない「真ん中の値」を知りたいとき

💡ポイント

  • データを昇順ソートしたうえで、件数が偶数なら中間2値の平均、奇数なら中央の1値を返します
  • 他の統計系関数(分散・標準偏差)と組み合わせると、より深い分析が可能です

Conclusion

以上、ROW_NUMBERLISTAGGMEDIAN の3つをご紹介しました。
ウィンドウ関数は最初はとっつきにくいかもしれませんが、使いこなせるようになると「SQLだけでできる分析」の幅がぐっと広がります。ぜひ業務の中でトライしながら、Redshift の魅力を体感してみてくださいね!

Discussion