2012-04-09 17 views
0

私は2つの日付列を持つテーブルを持っています。 DATE1はNULLになることがあり、重複した値が含まれることがあります。 DATE2は常に入力され一意です。私のテーブルは最新のDATE2日付でソートされています。MySQL datetimeと前回の行の比較

DATE1が選択される新しい日付列を作成したいのですが、値が次の行から複製されていないかNULLでない限り、作成したいと思います。この場合、DATE2の値を使用します。これらの条件のいずれかが満たされたときに私に教える2つのブール型列が必要です。私はそれを明確にするために例を使って説明しましょう。以下の表に

、行5および6は、私は(DATE2ある)2011年8月4日に行5の新しい日付列を設定したい2011年7月27日の値を有します。行3では、DATE1の値はNULLなので、DATE2の値を取得します。

私はいくつかの内部select文を試しましたが、これを動作させることはできません。何か案は?

私のテーブルには、現在データベースに立つよう:そんなに

Row  FINAL_DATE  DATE1_DUPLICATE DATE1_WAS_NULL 
    ---------------------------------------------------------- 
    1  Nov 13, 2011 TRUE    FALSE 
    2  Oct 10, 2011 FALSE    FALSE 
    3  Oct 8, 2011  FALSE    TRUE 
    4  Aug 12, 2011 FALSE    FALSE 
    5  Aug 4, 2011  TRUE    FALSE 
    6  Jul 27, 2011 FALSE    FALSE 
    7  Jul 1, 2011  FALSE    FALSE 
    8  May 24, 2011 FALSE    FALSE 

ありがとう:私は最終的な結果を期待して何

Row  DATE1   DATE2 
    -------------------------------------- 
    1  Oct 10, 2011 Nov 13, 2011  
    2  Oct 10, 2011 Oct 10, 2011  
    3  NULL   Oct 8, 2011  
    4  Aug 12, 2011 Aug 12, 2011  
    5  Jul 27, 2011 Aug 4, 2011  
    6  Jul 27, 2011 Jul 28, 2011  
    7  Jul 1, 2011  Jul 26, 2011  
    8  May 24, 2011 Jun 13, 2011 

が見えるように!

+1

@MattFenwick。誤解を招くと思われる場合は、より良いタグを提案できますか? – McGarnagle

+1

@MattFenwick良いコール、あなたは私の心を読む。 – McGarnagle

答えて

1

これは、テーブルの順次スキャンとMySQL変数を使用して処理できます。あなたは(を更新)SQL-fiddleでテストすることができます:私は、SQLのいずれかのタイプに固有ではない複数の行を、オーバー照会の意味でのタグを使用してい

SELECT date2 
    , dd 
    , DATE_FORMAT(dd, '%b %e, %Y') AS final_date 
    , date1_duplicate 
    , date1_was_null 
FROM 
(SELECT date2 
     , COALESCE((date1 = @d OR date1 = @prev), FALSE) 
      AS date1_duplicate 
     , (date1 IS NULL)    AS date1_was_null 
     , @d := CASE WHEN (date1 = @d OR date1 = @prev) 
       THEN date2 
       ELSE COALESCE(date1, date2) 
       END AS dd 
     , @prev := date1 AS pre 
    FROM tableX AS t 
    CROSS JOIN 
     (SELECT @d := DATE('1000-01-01') 
      , @prev := @d 
    ) AS dummy 
    ORDER BY date2 ASC 
) AS tmp 
ORDER BY date2 DESC 
; 
+0

とても近いです。唯一の問題は、date2列を使用するかどうかをチェックするときに、新しく計算された日付を取得しないことです。ここに例があります:http://sqlfiddle.com/#!2/5063c/3 4番目の行は11月19日でなければならず、10月10日ではありません。次の行はdate2で​​ソートされているので重複しています。 – http203

+0

「唯一の問題は、チェックするときに古い日付が取られないということです」と言います。私が何を意味しているかを理解していただければ幸いです – http203

+0

@ http203:クエリを更新しました。再度テストします。 –