🔖

【PostgreSQL】ウインドウ関数について

に公開

準備

sales

id product sale_date amount
1 A 2024-02-01 1000
2 A 2024-02-02 1500
3 A 2024-02-03 1200
4 B 2024-02-01 2000
5 B 2024-02-02 1800
-- sales テーブルの作成
CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    product VARCHAR(10) NOT NULL,
    sale_date DATE NOT NULL,
    amount INT NOT NULL
);

-- データの挿入
INSERT INTO sales (product, sale_date, amount) VALUES
('A', '2024-02-01', 1000),
('A', '2024-02-02', 1500),
('A', '2024-02-03', 1200),
('B', '2024-02-01', 2000),
('B', '2024-02-02', 1800);

ウィンドウ関数とは

SQLの集計関数(SUM, AVG, COUNT など)を使いながらも、元の行を保持したまま計算を行うことが出来る機能。

特徴

SQLの集計関数(SUM, AVG, COUNT など)を使いながらも、元の行を保持したまま計算を行うことが出来る(結果行の集約を行わない)

基本構文

ウィンドウ関数名(列名) OVER (PARTITION BY 分け方 ORDER BY 並び順)
  • ウィンドウ関数名:SUM, AVG, ROW_NUMBER, RANK など
  • OVER:各行を残しますよという指示
  • PARTITION BY:ここで指定したグループ(例:商品)ごとに集計などが行われる
  • ORDER BY:並び順に応じて計算を行う(例:日付順)

実験してみた

SUM関数で全データの売上金額の合計を求めてみる

SELECT SUM(amount) FROM sales;

OVER句を追加してみる、()の中には何も記述しない

各行に売上金額の合計が表示されている

SELECT product, sale_date, amount, 
    SUM(amount) OVER () AS cumulative_sales
FROM sales;

OVER句の()の中にPARTITION BYを記述

商品ごとの売上金額が表示されている(例:A商品の合計は3700円など)

SELECT product,amount, SUM(amount) OVER(PARTITION BY product) AS cumulative_sales 
FROM sales;

OVER句の()の中にORDER BY sale_dateを記述してみる

日付ごとの売上金額の累計が表示される
1.2024-02-01の合計→3000円
2.2024-02-02の合計→3300円(3000円+3300円=6300円)
3.2024-02-03の合計→1200円(6300円+1200円→7500円)

SELECT product, sale_date, amount, 
    SUM(amount) OVER (ORDER BY sale_date) AS cumulative_sales
FROM sales;

各商品の売上を日付順に累積していく

  • PARTITION BY product→商品ごとに
  • ORDER BY sale_date→sale_dateの順で
  • SUM(amount)→金額の合計をして(累計)
SELECT product,sale_date,amount, 
    SUM(amount) OVER (PARTITION BY product ORDER BY sale_date) AS cumulative_sales
FROM sales;

<出力例>

各商品ごとに売上の順位をつける(ランキング)

RANK() 関数を使うと、売上が高い順に順位をつけることが出来る。

SELECT 
    product, 
    sale_date, 
    amount, 
    RANK() OVER (PARTITION BY product ORDER BY amount DESC) AS ranking
FROM sales;

<出力例>

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion