我有一个包含两个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
非常感谢!
答案 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
;