MySQL按ID查找下一行值

时间:2017-04-11 17:43:07

标签: mysql sql

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

2 个答案:

答案 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;