SQL 分组和排序 -- 检索 table 中最新条目的详细信息

SQL Group By and Order -- retrieve detail for most recent entries in table

我想做一个 SQL 查询 returns 每个 bot_id 的最新条目。

我当前的请求看起来像这样,但它总是 returns 第一个条目。 DESC 和 ASC 没有任何区别:

SELECT bot_id, id
FROM t_request_history
GROUP BY bot_id
ORDER BY request_time DESC

表格如下所示:


t_request_history

id bot_id request response error request_time
1 usr_e74ae42b-080c-48e0-9e6c a a 0 2021-09-16 23:37:10
2 usr_e74ae42b-080c-48e0-9e6c a a 1 2021-09-16 23:37:35
3 usr_e74ae42b-080c-48e0-9e6c a a 1 2021-09-16 23:43:20
4 delete 1 1 1 2021-09-16 23:44:21
5 delete 1 1 0 2021-09-16 23:44:32
6 delete 1 1 0 2021-09-16 23:44:41



想要的结果

bot_id id
delete 6
usr_e74ae42b-080c-48e0-9e6c 3

实际结果

bot_id id
delete 4
usr_e74ae42b-080c-48e0-9e6c 1

有什么办法可以使这个查询工作吗?

看起来您的 id 值随着时间的推移而上升。也就是说,您的 table 中的新条目看起来比旧条目具有更高的 id 值。如果这是真的,

SELECT bot_id, MAX(id) id
FROM t_request_history
GROUP BY bot_id

得到你想要的。

如果 id 值不随时间增加,则必须使用子查询来查找每个 bot_id.

的最新时间
                 SELECT bot_id, MAX(request_time) request_time
                   FROM t_request_history
                  GROUP BY bot_id

然后您将该子查询加入到您的 table 中,如下所示:

SELECT a.bot_id, a.id
  FROM t_request_history a
  JOIN (
                    SELECT bot_id, MAX(request_time) request_time
                      FROM t_request_history
                     GROUP BY bot_id
       ) b   ON a.bot_id = b.bot_id
            AND a.request_time = b.request_time

JOIN 的 ON 条件仅从您的 table 中选择具有最新时间的行。

您可以使用 Window/Analytic 函数

SELECT distinct
 bot_id, MAX(request_time) OVER(PARTITION BY bot_id)
FROM t_request_history
;

SQLFiddle

您还可以在@MariaDB WindowFunction Max documentation

中找到更多关于用法的详细信息