我的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)
答案 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;