MySQLで日付を使ってデータをマージする方法

IT・プログラミング

背景

データベース内に時間の経過に伴うデータを管理している場合、例えば、財務データや販売データなど、前年の値を現在の値と比較する必要が出てくることがあります。SQLでは、JOINを使うことで、異なる条件でデータを結合し、必要な情報を取り出すことができます。

この記事では、MySQLのLEFT JOINを使用して、同じsecCodeを持つ1年前のデータを現在のデータにマージする方法について説明します。

1年前のデータをマージするための基本的なSQL構文

以下の例では、your_table_name というテーブルを使用して、secCodeが同じで、EndDateが1年違うレコードを結合します。

クエリ例

SELECT 
    t1.secCode,
    t1.EndDate,
    t1.Asset,
    t2.Asset AS Asset_b
FROM 
    your_table_name t1
LEFT JOIN 
    your_table_name t2
ON 
    t1.secCode = t2.secCode
    AND YEAR(t1.EndDate) = YEAR(t2.EndDate) + 1;

解説

  • SELECT 文: t1t2 という2つのテーブルエイリアス(別名)からデータを選択しています。t1.Assetは現在のデータの Asset 列を指し、t2.Asset AS Asset_b は1年前のデータの Asset 列を Asset_b という名前で取得しています。

  • FROM 文: your_table_name というテーブルにエイリアス t1 を付けています。LEFT JOIN では、t1 の全ての行を返します。

  • LEFT JOIN 文: 同じテーブル your_table_name をエイリアス t2 として再度結合しています。LEFT JOIN を使用することで、t1 に存在するすべての行を取得し、対応する t2 の行がない場合には NULL が返されます。

  • ON 条件: t1t2secCode が一致し、EndDate の年が1年差である行を結合する条件を指定しています。ここでは YEAR(t1.EndDate) = YEAR(t2.EndDate) + 1 により、t1EndDate と1年前の t2EndDate が一致する場合に結合します。

実行例

例えば、以下のようなデータが your_table_name テーブルに格納されているとします。

secCode EndDate Asset
001 2024-01-01 100
001 2023-01-01 90
002 2024-01-01 200
002 2023-01-01 180
003 2024-01-01 150

このテーブルに対して上記のクエリを実行すると、以下の結果が得られます。

secCode EndDate Asset Asset_b
001 2024-01-01 100 90
002 2024-01-01 200 180
003 2024-01-01 150 NULL

secCode 001と002には1年前の Asset データが存在するため、それぞれの Asset_b に値が入ります。secCode 003 には1年前のデータがないため、Asset_bNULL になります。

応用編:月や日まで考慮した結合

場合によっては、1年前のデータを年だけでなく月や日まで考慮して結合したい場合があります。その場合は、次のように月と日も ON 条件に追加します。

SELECT 
    t1.secCode,
    t1.EndDate,
    t1.Asset,
    t2.Asset AS Asset_b
FROM 
    your_table_name t1
LEFT JOIN 
    your_table_name t2
ON 
    t1.secCode = t2.secCode
    AND YEAR(t1.EndDate) = YEAR(t2.EndDate) + 1
    AND MONTH(t1.EndDate) = MONTH(t2.EndDate)
    AND DAY(t1.EndDate) = DAY(t2.EndDate);

このようにすることで、年月日が一致する1年前のデータだけをマージすることができます。

まとめ

LEFT JOINON 条件を組み合わせることで、別の日付のデータを現在のデータにマージすることができます。必要に応じて結合条件を調整し、特定の要件に合わせてデータを取得してみてください。

タイトルとURLをコピーしました