本文共 825 字,大约阅读时间需要 2 分钟。
在日志数据处理中,我们常常需要对每一行数据进行单独的计算。以下是一个典型的例子:
select ip, upper(url), access_timefrom log
这个查询会从log表中逐行提取ip、upper(url)和access_time三个字段的数据。
当需要对多行数据进行聚合操作时,group by命令会派上用场。以下是一个分组计算的示例:
select url, count(1) as cntsfrom loggroup by urlhaving cnts > 2
group by url:按照url字段进行分组。count(1):用于计数每一行数据,这里每一行都会算作1次计数。having cnts > 2:对分组后的数据进行过滤,只保留cnts大于2的记录。where关键字用于对整体数据进行过滤,而having则是对分组后的数据进行过滤。
非聚合函数是对单行数据进行操作,而聚合函数是对多行数据进行汇总或统计。以下是一个结合子查询和聚合函数的复杂示例:
select dt, url, cnts, max_ipfrom ( select dt, url, count(1) as cnts, max(ip) as max_ip from log where dt > '2017-08-04' group by dt, url) as tmpwhere cnts > 2
group by dt, url:先按日期dt和url分组。count(1):计算每个分组内的记录数。max(ip):在分组内找出ip字段的最大值。as tmp:将结果命名为tmp,方便后续操作。where cnts > 2:对最终结果进行过滤,仅保留cnts大于2的记录。这种方法可以帮助我们同时获取多个聚合结果,并对最终数据进行进一步的过滤。
转载地址:http://orefk.baihongyu.com/