SQLで1日前のデータを取得する方法について、具体的なクエリ例と実践的なテクニックを解説します。データベース別の違いや注意点も含めて、より効率的なデータ抽出方法を知りたくありませんか?
SQLで月ごとのデータを抽出する方法とテクニック
SQLを使って月単位でデータを抽出・集計する方法について、実践的なコード例と共に解説します。初心者でも理解できる基本的な構文から、より高度な集計方法まで、どのように使い分ければよいのでしょうか?
MySQLでは、DATE_FORMAT関数を使用して月単位でデータを抽出できます。以下は基本的な構文例です:
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS month,
COUNT(*) as count,
SUM(amount) as total_amount
FROM
sales_table
GROUP BY
DATE_FORMAT(created_at, '%Y-%m')
ORDER BY
month
このクエリは売上データを月ごとに集計し、件数と合計金額を表示します。
各データベースで使用できる月次抽出の方法は異なります:
-- MySQL/MariaDB
SELECT EXTRACT(MONTH FROM date_column) AS month
-- SQL Server
SELECT DATEPART(MONTH, date_column) AS month
-- PostgreSQL
SELECT date_trunc('month', date_column) AS month
特にSQL Serverでは、DATEPARTを使用することで年と月を別々に抽出できる特徴があります。
より複雑な集計には、サブクエリを活用します:
SELECT
ym,
SUM(daily_total) as monthly_total
FROM (
SELECT
DATE_FORMAT(sale_date, '%Y-%m') as ym,
SUM(amount) as daily_total
FROM
sales
GROUP BY
sale_date
) tmp
GROUP BY
ym
このアプローチにより、日次データを月次データに変換しながら、複数の集計処理を行うことができます。
大量のデータを扱う場合、以下の点に注意が必要です:
-- インデックス作成例
CREATE INDEX idx_date ON sales_table(created_at)
-- パーティショニング例
PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
)
より詳細な分析のための高度な集計方法を紹介します:
-- 前月比の計算
SELECT
current_month,
sales_amount,
LAG(sales_amount) OVER (ORDER BY current_month) as prev_month_sales,
(sales_amount - LAG(sales_amount) OVER (ORDER BY current_month)) /
LAG(sales_amount) OVER (ORDER BY current_month) * 100 as growth_rate
FROM (
SELECT
DATE_FORMAT(sale_date, '%Y-%m') as current_month,
SUM(amount) as sales_amount
FROM
sales
GROUP BY
DATE_FORMAT(sale_date, '%Y-%m')
) monthly_sales
このクエリでは、ウィンドウ関数を使用して前月比や成長率を計算しています。