7

一連の名前、イベント、および日付を含むテーブルがあります。evt5_date特定のイベント ( ) に関連する新しいフィールド ' ' を作成しましたevt5

各名前には複数のイベントを含めることができ、それぞれのタイミングがevt_dateフィールドに記録されます。evt1evt2に関連する2 つのイベントがありますevt5

evt5が最初に出現した日付を の前のすべてevt1evt2行に挿入したいと考えていevt5ます。orのevt5後に何もない場合、フィールドは空のままになります。evt1evt2

これはすべて、 ごとに行う必要があります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');
4

1 に答える 1

6

更新ステートメントを修正しました。現在は機能していると思います。GROUP BY nameあなたのバージョンでは意味がなかったので、その部分を省略しました。

UPDATE mytable AS t1
INNER JOIN
    (
      SELECT
        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
      GROUP BY a.evt_date
    ) AS nearest_dates ON nearest_dates.evt_date = t1.evt_date
SET t1.evt5_date = nearest_dates.nearest_date
WHERE t1.event IN ('evt1', 'evt2');

最初の検証: http://sqlfiddle.com/#!2/309ac/6

最後のUPDATEクエリ: http://sqlfiddle.com/#!2/80c3c/1

于 2012-06-18T17:04:53.310 に答える