一連の名前、イベント、および日付を含むテーブルがあります。evt5_date
特定のイベント ( ) に関連する新しいフィールド ' ' を作成しましたevt5
。
各名前には複数のイベントを含めることができ、それぞれのタイミングがevt_date
フィールドに記録されます。evt1
とevt2
に関連する2 つのイベントがありますevt5
。
evt5
が最初に出現した日付を の前のすべてevt1
のevt2
行に挿入したいと考えていevt5
ます。orのevt5
後に何もない場合、フィールドは空のままになります。evt1
evt2
これはすべて、 ごとに行う必要がありますname
。数千の異なる名前があります。以下のデータには2つしか表示されていません
現在のテーブル データ- evt5_date に値がありません
name evt_date event evt5_date
name-1 2010-06-30 evt1
name-1 2009-10-30 evt5
name-1 2009-09-30 evt2
name-1 2009-06-30 evt5
name-1 2009-03-30 evt5
name-1 2009-02-28 evt2
name-1 2009-01-30 evt1
name-2 2005-05-30 evt2
name-2 2005-03-30 evt5
name-2 2005-01-30 evt1
どのように見えるか- evt5_date フィールドの値
name evt_date event evt5_date
name-1 2010-06-30 evt1
name-1 2009-10-30 evt5
name-1 2009-09-30 evt2 2009-10-30
name-1 2009-06-30 evt5
name-1 2009-03-30 evt5
name-1 2009-02-28 evt2 2009-03-30
name-1 2009-01-30 evt1 2009-03-30
name-2 2005-05-30 evt2
name-2 2005-03-30 evt5
name-2 2005-01-30 evt1 2005-03-31
以下のコードで更新を実行しようとしましたが、evt1 の evt_date よりも大きい evt5 の日付と evt2 の日付の間のリンクを指定する方法がわかりませんでした。最新のevt5。
イベントは名前ごとに固有であるため、名前でグループ化する必要もあります。
update mytable as t1
set t1.evt5_date = (select min(t2.evt_date) from mytable as t2
where t2.event = 'evt5' AND
t2.evt_date > t1.evt_date
group by name)
where
t1.event in ('evt1', 'evt2')
どんな提案でも大歓迎です。ありがとう
最終的な解決策を更新する- @biziclop によって提供された、いくつかの小さな変更を加えて、name
UPDATE mytable AS t1
INNER JOIN
(
SELECT
a.name, a.evt_date,
MIN( b.evt_date ) AS nearest_date
FROM mytable AS a
INNER JOIN mytable AS b ON b.event = 'evt5'
AND b.evt_date > a.evt_date
AND a.name = b.name -- needed this additional condition
GROUP BY a.name, a.evt_date -- added 'a.name' to 'group by'
) AS nearest_dates
ON nearest_dates.evt_date = t1.evt_date AND
nearest_dates.name = t1.name -- added this additional condition
SET t1.evt5_date = nearest_dates.nearest_date
WHERE t1.event IN ('evt1', 'evt2');