ClickHouse字段分组聚合、按照任意时间段粒度查询SQL

ClickHouse字段分组聚合、按照任意时间段粒度查询SQL


在这里插入图片描述

需求

  • 基础数据入库,需要根据字段做一些聚合
  • 现有路口过车数据,有各种车型,需要统计总流量和各个车型流量,要一起返回
  • 现有过车数据,需要按照时间不同粒度,统计车流量,实现不同时间粒度求和,5分钟、10分钟、半小时、一个月、一年都行

解决

使用if和sum

  • 主要是使用if,符合条件为1,不符合为0,再使用sum求和
select
	count(1) as "总流量",
	SUM(if(vehicle_type = 'PEDESTRIAN', 1, 0)) as "行人流量",
	SUM(if(vehicle_type = 'NON_MOTORIZED', 1, 0)) as "非机动车流量",
	SUM(if(vehicle_type = 'LIGHT_DUTY', 1, 0)) as "小型车流量",
	SUM(if(vehicle_type = 'MEDIAN_SIZED', 1, 0)) as "中型车流量",
	SUM(if(vehicle_type = 'OVERSIZE', 1, 0)) as "大车流量"
from
	passing_vehicle
where
	exist_time > 0
	and time_stamp > toDateTime('2022-06-30 11:00:00')
	and time_stamp < toDateTime('2022-06-30 15:00:00')
;

使用toStartOfInterval

select
	toStartOfInterval(time_stamp , INTERVAL 30 minute) as half_hour,
	count(1) as "总流量",
	SUM(if(vehicle_type = 'PEDESTRIAN', 1, 0)) as "行人流量",
	SUM(if(vehicle_type = 'NON_MOTORIZED', 1, 0)) as "非机动车流量",
	SUM(if(vehicle_type = 'LIGHT_DUTY', 1, 0)) as "小型车流量",
	SUM(if(vehicle_type = 'MEDIAN_SIZED', 1, 0)) as "中型车流量",
	SUM(if(vehicle_type = 'OVERSIZE', 1, 0)) as "大车流量"
from
	passing_vehicle
where
	exist_time > 0
	and time_stamp > toDateTime('2022-06-30 11:00:00')
	and time_stamp < toDateTime('2022-06-30 15:00:00')
group by
	half_hour,
order by
	half_hour;
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您可以使用MySQL的GROUP BY语句和MAX()聚合函数来查询表中某个时间最大值,然后按照某个字段分组。假设您要查询的表名为`table_name`,时间字段为`time_field`,分组字段为`group_field`,则可以使用以下查询语句: ``` SELECT group_field, MAX(time_field) AS max_time FROM table_name GROUP BY group_field; ``` 这将返回每个分组字段的最大时间值。如果您还需要包括其他字段,则可以将它们添加到SELECT语句中,并将它们添加到GROUP BY语句中,如下所示: ``` SELECT group_field, other_field, MAX(time_field) AS max_time FROM table_name GROUP BY group_field, other_field; ``` 这将返回每个分组字段和其他字段的最大时间值。 ### 回答2: 要查询表中某个时间字段的最大值,并按照另一个字段进行分组,可以使用以下SQL语句: ```sql SELECT 分组字段, MAX(时间字段) AS 最大时间 FROM 表名 GROUP BY 分组字段; ``` 具体步骤如下: 1. 使用SELECT语句来选择字段,并使用MAX函数获取时间字段的最大值。将结果命名为"最大时间"。 2. 使用FROM语句指定要查询的表名。 3. 使用GROUP BY语句来按照指定的字段进行分组。 4. 最后,执行上述SQL语句,查询到表中某个时间字段的最大值,按照某个字段进行分组,并返回结果。 注意事项: - 将"表名"替换为实际的表名。 - 将"时间字段"和"分组字段"替换为实际的字段名。 - 如果要增加其他字段的输出,可在SELECT语句中添加。 例如,查询一个名为"orders"的表中"order_date"字段的最大日期,按照"customer_id"字段进行分组: ```sql SELECT customer_id, MAX(order_date) AS 最大日期 FROM orders GROUP BY customer_id; ``` 这将返回一个结果集,其中每个分组的"customer_id"和对应的最大日期。 ### 回答3: 可以通过以下步骤使用MySQL查询表中某个时间最大值并按照某个字段分组: 1. 使用MAX()函数找到表中某个时间字段的最大值。例如,如果时间字段名为"timestamp",则可以使用以下语句获取最大值: SELECT MAX(timestamp) FROM 表名; 2. 使用GROUP BY子句按照某个字段分组。假设要按照字段"category"进行分组,则可以在查询语句中添加以下代码: GROUP BY category; 所以,最终的查询语句将类似于: SELECT MAX(timestamp) FROM 表名 GROUP BY category; 以上查询语句将返回每个不同类别的时间字段的最大值,并按照类别分组。 注意:请将"表名"和"timestamp"字段名替换为实际使用的表和字段名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持是一种态度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值