2017-04-11 73 views
0
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 

尋找下一行的值,我想格式化爲:的MySQL通過ID

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

不要在MySQL中使用變量。這種邏輯將更好地駐留在您的應用程序使用的任何語言。但是,這可以在SQL中完成。

我的第一本能就是將這些數據保存在一個額外的列中。不要擔心分貝的大小 - 宇宙中沒有足夠的月份成爲問題。

你的ID也有問題:這些應該幾乎總是主鍵,我。即獨特。

如果你堅持你的計劃,你可以使用加入。假設連續的唯一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;

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;