我有一个包含大量数据的表(仍在 MySQL 5.7 上)。该表是由一些脚本编写的。它的工作原理类似于“签到”,每个代理都会在一段时间内签到。看起来像下面这样。
ID | 代理人 | 地位 | 时间戳 |
---|---|---|---|
1 | 汤姆 | 好的 | 2023-03-16 12:27:03 |
2 | 杰夫 | 退化的 | 2023-08-31 00:01:13 |
100 | 汤姆 | 好的 | 2023-10-03 12:00:00 |
101 | 杰夫 | 好的 | 2023-10-03 11:59:00 |
我想为每位特工挑选最新鲜的线路。因此,在上面的示例中,我想要获取第 100 行和第 101 行。
我使用以下脚本,但结果只有前两行。我尝试按 id 或时间戳 ASC/DESC 更改顺序。
SELECT * FROM (SELECT * FROM db_table ORDER BY timestamp ASC) as agnt GROUP BY agent
如何让它发挥作用?
有多种方法可以解决此类问题。我通常使用窗口函数,例如
ROW_NUMBER()
按特定排序标准枚举行。然后,您可以使用该枚举仅选择所需的行。不幸的是,在 MySQL 5.7 及更早版本中,窗口函数不存在,因此替代解决方案是使用相关子查询,如下所示:
请注意,只有当表中的
timestamp
相同内容不重复时,这才有效。agent