最近遇到统计Oracle数据库请求记录表中所有API的最高并发量,这个就涉及从日志表中提取API访问记录,并计算每个API在每个时间点的并发请求数,然后找出每个API的最高并发量。
SQL实现
使用Oracle的窗口函数COUNT(*) OVER来计算每个时间点的并发请求数,随后找出每个API的最高并发量。
sql
WITH concurrent_requests AS (
SELECT
api_name,
access_time,
COUNT(*) OVER (PARTITION BY api_name, access_time) AS concurrent_requests
FROM
api_logs
WHERE
access_time BETWEEN TO_TIMESTAMP('2023-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND TO_TIMESTAMP('2023-07-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
)
SELECT
api_name,
MAX(concurrent_requests) AS max_concurrent_requests
FROM
concurrent_requests
GROUP BY
api_name
ORDER BY
max_concurrent_requests DESC;
说明
WITH concurrent_requests AS (...)
: 这个CTE计算每个API在每个时间点的并发请求数。COUNT(*) OVER (PARTITION BY api_name, access_time)
: 使用分析函数按API名称和时间戳分区,计算每个时间点的并发请求数。WHERE access_time BETWEEN ...AND...
: 过滤条件只选取7月份的数据。这里使用TO_TIMESTAMP函数来指定时间范围。MAX(concurrent_requests)
: 找出每个API在7月份的最高并发量。GROUP BY api_name
: 将结果按API名称分组,以统计每个API的最高并发量。ORDER BY max_concurrent_requests DESC
: 按并发量从高到低排序。