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
;
中找到更多关于用法的详细信息
我想做一个 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
;
中找到更多关于用法的详细信息