首页 > 解决方案 > 在 MySQL 中使用 LAG 和 GROUP BY 获取每个 ID 的最后三个动作

问题描述

我希望有人可以帮助解决这个查询,我需要一个对最后日期的 id 进行分组的查询,但我希望有 3 个最后一个动作的三列。

所以我尝试按 id 分组并使用 MAX(date),并使用 LAG 来获取最后三个动作,但我从 (PARTITION BY id ORDER BY id..) 中得到一个错误。

如果我删除两个 LAG 函数,则查询运行。我不知道我是否在那里遗漏了什么。我正在使用 MySQL Workbench 8.0 CE

SELECT
    id,
    MAX(t1.date),
    LAG(Move, 2, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move1,
    LAG(Move, 1, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move2,
    Move AS Move3 ,
    action_ticket,
FROM table t1
GROUP BY t1.id

这是我的表:

ID 日期 移动 行动票
12 25/02/20 向上 规模
12 26/02/20 规模
12 2020 年 2 月 27 日 剩下 解决了
15 2020 年 2 月 23 日 剩下 规模
15 22/02/20 向上 规模
15 25/02/20 正确的 解决了

我想要得到的表格是:

ID 日期 移动1 移动2 移动3 行动票
12 2020 年 2 月 27 日 向上 剩下 解决了
15 25/02/20 向上 剩下 正确的 解决了

非常感谢任何帮助。非常感谢

玛丽亚·J。

标签: mysqlsql

解决方案


这个查询应该有帮助:

Select * from
(SELECT
    id,
    MAX(t1.date),
    LAG(move, 2, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move1,
    LAG(move, 1, NULL) OVER (PARTITION BY id ORDER BY id ASC) AS Move2,
    LAST_VALUE(move) OVER (PARTITION BY id ORDER BY id ASC) AS Move3,
    LAST_VALUE(action_ticket) OVER (PARTITION BY id ORDER BY id ASC) AS ActionTicket
FROM t1
GROUP BY id, move, action_ticket
) as t1
where Move1 is not null

我使用了一个派生表,它创建了所有行并过滤掉了Move1为空的行,因为该行没有足够的信息。

我不确定您提供的数据是否所有 id 在表中都恰好有 3 行。如果有多种行数,则需要重新访问此查询。


推荐阅读