PostgreSQL:前月のデータを賢く抽出!3つの方法を徹底解説
PostgreSQLで前月のデータを取得する方法
方法1:BETWEEN句を使用する
SELECT *
FROM your_table
WHERE date_column BETWEEN date_trunc('month', current_date) - interval '1 month'
AND date_trunc('month', current_date);
解説:
date_trunc('month', current_date) - interval '1 month'
:前月の最初の日を算出します。BETWEEN
句:指定した範囲の日付を含むレコードのみを選択します。
方法2:CURRENT_DATE関数とinterval演算子を使用する
SELECT *
FROM your_table
WHERE date_column >= CURRENT_DATE - interval '1 month'
AND date_column < CURRENT_DATE;
CURRENT_DATE - interval '1 month'
:前月の最後の日を算出します。CURRENT_DATE
:現在の日付を取得します。>=
と<
:前月の範囲内に含まれるレコードのみを選択します。
補足:
- 上記のコードは、
date_column
が日付型のカラムであることを前提としています。 - 時間を含むデータを取得したい場合は、
timestamp
型のカラムを使用する必要があります。 - より複雑な条件で前月のデータを取得したい場合は、WHERE句に他の条件を追加することができます。
PostgreSQLで前月のデータを取得するサンプルコード
対象テーブル:
CREATE TABLE sales (
id serial PRIMARY KEY,
product_id integer,
sales_date date,
sales_amount integer
);
INSERT INTO sales (product_id, sales_date, sales_amount) VALUES
(1, '2024-05-10', 100),
(1, '2024-05-17', 150),
(1, '2024-05-24', 200),
(2, '2024-05-31', 300),
(2, '2024-06-07', 250),
(2, '2024-06-14', 400);
SELECT *
FROM sales
WHERE sales_date BETWEEN date_trunc('month', current_date) - interval '1 month'
AND date_trunc('month', current_date);
結果:
id | product_id | sales_date | sales_amount
---+-----------+------------+--------------
4 | 2 | 2024-05-31 | 300
5 | 2 | 2024-06-07 | 250
6 | 2 | 2024-06-14 | 400
SELECT *
FROM sales
WHERE sales_date >= CURRENT_DATE - interval '1 month'
AND sales_date < CURRENT_DATE;
id | product_id | sales_date | sales_amount
---+-----------+------------+--------------
4 | 2 | 2024-05-31 | 300
5 | 2 | 2024-06-07 | 250
6 | 2 | 2024-06-14 | 400
PostgreSQLで前月のデータを取得するその他の方法
generate_series関数とfilter関数を使用する
この方法は、前月のすべての日にちを生成し、そのうち実際にデータが存在する日付のみを抽出する方法です。
SELECT *
FROM sales
WHERE sales_date IN (
SELECT date
FROM generate_series(
date_trunc('month', current_date) - interval '1 month',
date_trunc('month', current_date),
interval '1 day'
) AS date
WHERE EXISTS (
SELECT *
FROM sales
WHERE sales_date = date
)
);
CTE (Common Table Expression) を使用する
この方法は、前月の開始日と終了日をCTEとして定義し、その期間に含まれるデータのみを抽出する方法です。
WITH previous_month AS (
SELECT
date_trunc('month', current_date) - interval '1 month' AS start_date,
date_trunc('month', current_date) AS end_date
)
SELECT *
FROM sales
WHERE sales_date BETWEEN (SELECT start_date FROM previous_month)
AND (SELECT end_date FROM previous_month);
サブクエリを使用する
SELECT *
FROM sales
WHERE sales_date BETWEEN (
SELECT date_trunc('month', current_date) - interval '1 month'
)
AND (
SELECT date_trunc('month', current_date)
);
- データ量が少ない場合や、単純な条件で前月のデータを取得したい場合は、方法1がシンプルでわかりやすいでしょう。
- データ量が多い場合や、複雑な条件で前月のデータを取得したい場合は、方法2や方法3の方が効率的に処理できる可能性があります。
- 上記のコードはあくまでも例であり、必要に応じて修正する必要があります。
- PostgreSQLには、ここで紹介しきれないほど多くの便利な機能があります。詳細は、PostgreSQL公式ドキュメントを参照してください。
postgresql