2つのテーブル間に1:多のリレーションシップあり、その中でn個以上紐付きのあるデータを洗い出したいことがあった。
その時にwindow関数を使用したので、忘れないように記録しておく。
やりたいこと
複数のデータの紐付きがあるものを抽出する。
今回は注文を複数している顧客のidを抽出してみる。
テーブル構成
- 顧客のデータを保存するusersテーブル
- 注文データを保存するordersテーブル
- usersとordersは1:多の関係(userは複数のorderを持つことができる)
SQL
集約関数だと複数の行が一つにまとまってしまうため、window関数を使用して対象のデータを洗い出す。
SELECT
u.id
FROM
users AS u
INNER JOIN (
SELECT
count(id) OVER (PARTITION BY user_id) AS counter,
*
FROM
orders
) AS o ON u.id = o.user_id
AND o.counter > 2;
参考