这是一个ClickHouse请求,但我认为我缺少一些核心sql解决方案。我想计算每天每分钟的最大行数:
SELECT date_date,
formatDateTime(date_time,'%F %H:%M:00', 'Asia/Dubai') AS Max_TPS_Time,
count(1) AS Max_TPS
FROM TEST
GROUP BY Max_TPS_Time,
date_date
哪个结果
date_date Max_TPS_Time Max_TPS
19/11/19 2019-11-19 11:37:00 4
19/11/19 2019-11-19 11:15:00 2
19/11/19 2019-11-19 11:40:00 5
19/11/18 2019-11-18 12:37:00 4
19/11/18 2019-11-18 12:15:00 2
19/11/18 2019-11-18 12:40:00 6
最后,我想在适当的日期时间看到每天的最大值。
date_date Max_TPS_Time Max_TPS
19/11/19 2019-11-19 11:40:00 5
19/11/18 2019-11-18 12:40:00 6
您正在从汇总查询的结果中查找每组的前1条记录。
据我所知,clickhouse不支持窗口功能(这会使此任务更加容易)。
但是它支持常用的表表达式:因此您可以将现有查询转换为CTE,然后使用自相关子查询进行过滤:
WITH cte as (
SELECT
date_date,
formatDateTime(date_time,'%F %H:%M:00', 'Asia/Dubai') AS Max_TPS_Time,
count(*) AS Max_TPS
FROM TEST
GROUP BY Max_TPS_Time, date_date
)
SELECT c.*
FROM cte c
WHERE c.Max_TPS = (SELECT MAX(c1.Max_TPS) FROM cte c1 WHERE c1.date_date = c.date_date)
[请注意,如果您每天只需要Max_TPS
,但不需要相应的Max_TPS_Time
,那么它很简单,您可以在当前查询中添加另一级别的汇总:
SELECT date_date, MAX(Max_TPS) Max_TPS
FROM (
SELECT
date_date,
formatDateTime(date_time,'%F %H:%M:00', 'Asia/Dubai') AS Max_TPS_Time,
count(*) AS Max_TPS
FROM TEST
GROUP BY Max_TPS_Time, date_date
) t
GROUP BY date_date
SELECT date_date,
formatDateTime(date_time,'%F %H:%M:00', 'Asia/Dubai') AS Max_TPS_Time,
count() AS Max_TPS
FROM TEST GROUP BY Max_TPS_Time, date_date
order by Max_TPS_Time, date_date, Max_TPS desc
limit 1 by Max_TPS_Time, date_date
select argMax(date_date, Max_TPS) date_date, argMax(Max_TPS_Time, Max_TPS) Max_TPS_Time
from (
SELECT date_date,
formatDateTime(date_time,'%F %H:%M:00', 'Asia/Dubai') AS Max_TPS_Time,
count() AS Max_TPS
FROM TEST GROUP BY Max_TPS_Time, date_date)