id month status
1 1997-11-01 A
1 2015-08-01 B
2 2010-01-01 A
2 2010-02-01 B
2 2012-10-01 C
我想格式化为:
id month lead_month status
1 1997-11-01 2015-08-01 A
1 2015-08-01 NOW() B
2 2010-01-01 2010-02-01 A
2 2010-02-01 2012-10-01 B
2 2012-10-01 NOW() C
MySQL对我来说是新手,我无法绕过变量。我更喜欢使用简单的LEAD()
和PARTITION
但不幸的是,我不能这样做。
这是我的尝试,但不起作用:
SET @lead = '1995-01-01'; --abitrary floor
select id, month, status, @lead, @lead:=month from table
输出如下所示,它也不会检查行与行之间的ID是否相同:
id month lead_month status
1 1997-11-01 1995-01-01 A
1 2015-08-01 1997-11-01 B
2 2010-01-01 2015-08-01 A
2 2010-02-01 2010-01-01 B
2 2012-10-01 2010-02-01 C
答案 0 :(得分:0)
不要乱用MySQL中的变量。这种逻辑更好地存在于您为应用程序使用的任何语言中。但是,这可以在SQL中完成。
我的第一直觉就是将这些数据保存在一个额外的列中。不要担心数据库的大小 - 宇宙中没有足够的月份成为问题。
你的id也有问题:这几乎应该是主键,i。即独特。
如果你坚持你的计划,你可以使用加入。假设连续的唯一ID:
SELECT a.id, a.month, b.month AS lead_month, status FROM table AS a LEFT JOIN table AS b WHERE a.id - 1 = b.id;
答案 1 :(得分:0)
您可以使用相关子查询:
select t.*,
(select t2.month
from t t2
where t.id = t2.id
order by t2.month desc
limit 1
) as next_month
from t;
如果您想替换每个ID的上个月的值,那么您可以使用coalesce()
:
select t.*,
coalesce((select t2.month
from t t2
where t.id = t2.id
order by t2.month desc
limit 1
), now()) as next_month
from t;