为每行和 ID 添加最后 3 个日期条目 mysql

append last 3 date entries for each row and id mysql

我目前正在 SQL 之外执行此逻辑,但这需要很长时间。是否可以使用 SQL 来加快速度?

我有数据:

id    date          
1     2020-01-01
1     2019-08-01
1     2018-06-01
1     2018-03-01
2     2020-04-01
2     2020-07-01

每一行都有一个 ID 和日期列。

对于此 table 中的每一行,我想附加该 ID 的前 3 个日期。

所以这个例子中的输出是:

id    date0         date1         date2         date3
1     2020-01-01    2019-08-01    2018-06-01    2018-03-01 
1     2019-08-01    2018-06-01    2018-03-01    
1     2018-06-01    2018-03-01    
1     2018-03-01   
2     2020-04-01    2020-07-01
2     2020-07-01

这可能吗?

如果你是运行 MySQL 8.0,你可以直接使用two-arguments形式的lag():

select id, date,
    lag(date, 1) over(partition by id order by date) date1,
    lag(date, 2) over(partition by id order by date) date2,
    lag(date, 3) over(partition by id order by date) date3
from mytable

在早期版本中,一个替代方案是几个相关的子查询:

select id, date,
    (select t1.date from mytable t1 where t1.id = t.id and t1.date < t.date order by t1.date desc limit 1) date1,
    (select t1.date from mytable t1 where t1.id = t.id and t1.date < t.date order by t1.date desc limit 1, 1) date2,
    (select t1.date from mytable t1 where t1.id = t.id and t1.date < t.date order by t1.date desc limit 2, 1) date3
from mytable t

我想问您是否要为每个日期单独列一列。也许将它们串联起来会起作用:

select id, group_concat(date order by date desc)
from t
group by id;