📈
Amazon Redshift で押さえておきたいウィンドウ関数3選
Overview
Amazon Redshift のウィンドウ関数は、集計以上の柔軟なデータ分析を可能にしてくれます。本記事では、その中でも特に頻繁に使われる3つの関数――ROW_NUMBER
、LISTAGG
、MEDIAN
――に絞って解説します。実際の業務で「あれ?どう書くんだっけ…?」となったときにも、さっと引けるリファレンスとしてお役立てしてみてください!
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_NUMBER
、LISTAGG
、MEDIAN
の3つをご紹介しました。
ウィンドウ関数は最初はとっつきにくいかもしれませんが、使いこなせるようになると「SQLだけでできる分析」の幅がぐっと広がります。ぜひ業務の中でトライしながら、Redshift の魅力を体感してみてくださいね!
Discussion