分组,每组最多选择一个分组

问题描述 投票:0回答:2

这是一个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
sql group-by greatest-n-per-group clickhouse
2个回答
0
投票

您正在从汇总查询的结果中查找每组的前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

0
投票
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)
© www.soinside.com 2019 - 2024. All rights reserved.