SQLで窓関数と複数テーブルのJOINを効率的に利用するシナリオ解説

この記事では、SQLの窓関数(Window Functions)と複数テーブルのJOINを効率的に利用するシナリオについて解説します。具体的なデータテーブルとコード例を用いて、各機能の有用性と応用方法について詳しく説明します。

目次

窓関数(Window Functions)とは

窓関数はSQLの強力な機能の一つで、レコードを独立したものとしてではなく、特定の「窓」または「範囲」の中の関連するレコードとともに考慮する方法です。

基本的な窓関数の使用例

SELECT name, salary,
       AVG(salary) OVER () AS avg_salary
FROM employees;

パーティションを使用した窓関数

SELECT name, department, salary,
       AVG(salary) OVER (PARTITION BY department) AS avg_salary_by_department
FROM employees;

複数テーブルのJOINとは

JOINは、複数のテーブルからデータを効率よく抽出するためのSQLの基本的な操作です。

INNER JOINの基本的な使用例

SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

LEFT JOINの基本的な使用例

SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

窓関数と複数テーブルのJOINの組み合わせシナリオ

窓関数とJOINを組み合わせることで、さまざまな高度なデータ操作が可能です。

シナリオ1: 商品の月次売上とその月の平均売上を計算

productsテーブルsalesテーブル
product_id, product_namesale_id, product_id, sale_date, sale_amount
データテーブルの設計
SELECT p.product_name, s.sale_date, 
       SUM(s.sale_amount) OVER (PARTITION BY s.sale_date) AS daily_sales,
       AVG(s.sale_amount) OVER (PARTITION BY s.sale_date) AS avg_daily_sales
FROM products p
LEFT JOIN sales s ON p.product_id = s.product_id
WHERE MONTH(s.sale_date) = 7;

シナリオ2: 従業員の給与と部署別の平均給与を一覧表示

employeesテーブルdepartmentsテーブル
employee_id, name, department_id, salarydepartment_id, department_name
データテーブルの設計
SELECT e.name, d.department_name, e.salary,
       AVG(e.salary) OVER (PARTITION BY e.department_id) AS avg_department_salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

まとめ

窓関数と複数テーブルのJOINは、データ分析において非常に高度な操作を可能にするSQLの機能です。これらの機能を理解し、適切に使用することで、より深い洞察と効率的なデータ操作が可能になります。

コメント

コメントする

目次