2012-04-09 46 views
0

我有一個包含兩個日期列的表。 DATE1有時是NULL,有時包含重複的值。 DATE2始終填充且唯一。我的表格按最新的DATE2日期排序。與前一行的MySQL日期時間比較

我想創建一個新的日期列,其中DATE1將被選中,除非它的值是從下一行重複或它是NULL。在這種情況下,我想取DATE2的值。我還需要兩個布爾列,告訴我何時滿足這些條件。讓我用一個例子來演示,以便更清晰。

在下面的表中,行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 

非常感謝!

+1

@MattFenwick。如果你認爲這是誤導性的,你能建議一個更好的標籤嗎? – McGarnagle 2012-04-09 20:19:58

+1

@MattFenwick很好的通話,你讀了我的腦海。 – McGarnagle 2012-04-09 20:24:23

回答

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 2012-04-10 02:30:21

+0

我的意思是說:「唯一的問題是,它檢查時不會採用舊的日期......」。我希望你明白我的意思。 – http203 2012-04-10 02:39:35

+0

@ http203:更新了查詢。再次測試。 – 2012-04-16 21:46:39