0

2 つの日付列を持つテーブルがあります。DATE1 は NULL の場合もあれば、重複する値が含まれている場合もあります。DATE2 は常に入力され、一意です。私のテーブルは、最新の DATE2 日付で並べ替えられています。

値が次の行から複製されるか、NULL でない限り、DATE1 が選択される新しい日付列を作成したいと思います。この場合、DATE2 の値を取得します。また、これらの条件のいずれかがいつ満たされたかを示す 2 つのブール列も必要です。わかりやすいように、例を使用して説明します。

下の表では、行 5 と行 6 の値が2011 年 7 月 27 日であるため、行 5 の新しい日付列を2011 年 8 月 4 日(DATE2)に設定したいと考えています。行 3 では、DATE1 の値が NULL なので、DATE2 の値を取得します。

いくつかの内部選択ステートメントを試しましたが、これを機能させることができません。何か案は?

現在データベースにある私のテーブル:

    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

最終結果は次のようになると思います。

    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

本当にありがとう!

4

1 に答える 1

1

これは、テーブルのシーケンシャル スキャンと MySQL 変数を使用して処理できます。(更新されたSQL-fiddleでテストできます:

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
;
于 2012-04-09T22:24:23.020 に答える