为每行和 id mysql 附加最后 3 个日期条目
Posted
技术标签:
【中文标题】为每行和 id mysql 附加最后 3 个日期条目【英文标题】:append last 3 date entries for each row and id mysql 【发布时间】:2020-10-09 22:15:47 【问题描述】:我目前正在 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 和日期列。
对于此表中的每一行,我想为该 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
这可能吗?
【问题讨论】:
【参考方案1】:如果您运行的是 mysql 8.0,则可以只使用 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
【讨论】:
谢谢,不适合我,我想是因为版本:query("select version()") version() 1 5.7.31-0ubuntu0.18.04.1
你知道这个版本的另一个解决方案吗?【参考方案2】:
我会质疑您是否希望每个日期都有一个单独的列。也许将它们连接起来会起作用:
select id, group_concat(date order by date desc)
from t
group by id;
【讨论】:
以上是关于为每行和 id mysql 附加最后 3 个日期条目的主要内容,如果未能解决你的问题,请参考以下文章