为每行和 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 个日期条目的主要内容,如果未能解决你的问题,请参考以下文章

获取每行包含相同日期的 MYSQL 表的行数

mysql怎么查询一条记录的前一条记录和后一条记录

在两个表mysql上左连接时获取最后修改日期

Postgresql:如何在聚合函数之后显示附加列

关于mysql怎么取表或者视图最后一条数据,不能使用ID

选择每个类别的最后 3 条新闻 - 两个表 - (MySQL - PHP)