MySQL datetime与前一行的比较

时间:2012-04-09 20:13:20

标签: mysql window-functions

我有一个包含两个Date列的表。 DATE1有时为NULL,有时包含重复值。 DATE2始终填充且唯一。我的表按最新的DATE2日期排序。

我想创建一个新的日期列,其中将选择DATE1,除非它的值从下一行复制或者为NULL。在这种情况下,我想取DATE2的值。我还需要两个布尔列,告诉我何时满足这些条件。让我演示使用一个例子,这样更清楚。

在下表中,第5行和第6行的值为 2011年7月27日,因此我想将第5行的新日期列设置为 2011年8月4日< / strong>(这是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 个答案:

答案 0 :(得分: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
;