1

我的 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)

4

2 回答 2

4

我认为最简单的方法是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 有更多的日期,那么这种机制可能不是最好的机制。

于 2017-10-04T16:14:12.340 回答
0

例如:

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;
于 2017-10-04T17:26:19.857 回答