如何检索每个ID的最新和第二个最新日期?

时间:2017-10-04 16:09:14

标签: mysql sql maxdate

我的SQL数据库看起来像这样

ID DATE 
1  2017-01-01
1  2017-01-03
1  2017-01-05
2  2017-01-06 
2  2017-01-07
2  2017-01-08
2  2017-01-11
3  2017-01-11

如何检索每个ID的Max(DATE)和第二个最新日期,如下所示。

 ID MAXDATE     SECONDMAXDATE        
 1  2017-01-05  2017-01-03  
 2  2017-01-11  2017-01-08
 3  2017-01-11  2017-01-11 (or 'NONE')

PS:当只有1条记录时,SECONDMAXDATE可以显示MAXDATE或STRING(例如NONE)

2 个答案:

答案 0 :(得分:3)

我认为最简单的方法是group_concat() / substring_index()" hack":

select id, max(date),
       substring_index(substring_index(group_concat(date order by date desc), ',', 2), ',', -1) as second_date
from t
group by id;

注意:这会将第二个日期作为字符串而不是日期返回。如果您愿意,可以将其转换回日期。

此外,group_concat()的默认最大长度为1,024字节。这对于大多数目的来说已经足够了(一百个左右)。如果每个id有更多日期,那么这种机制可能不是最好的机制。

答案 1 :(得分:0)

E.g:

SELECT x.id
     , x.date
  FROM
     ( SELECT id
            , date
            , CASE WHEN @prev=id THEN @i:=@i+1 ELSE @i:=1 END i
            , @prev:=id prev 
         FROM my_table
            , ( SELECT @prev:=null,@i:=0 ) vars
        ORDER
           BY id
            , date DESC
     ) x
 WHERE i <= 2;