【每周一期-数据蒋堂】非常规聚合
标准SQL中提供了五种最常用的聚合运算:SUM/COUNT/AVG/MIN/MAX。观察这几个运算,我们发现它们都可以看成是一个以集合为参数返回单值的函数,我们就先把这个共同点理解为聚合运算的定义,把集合变成单值,多个值变成一个值,也就是发生了"聚合“,所以叫聚合运算。
那么很显然,有集合的时候就可以应用聚合运算了,所以SUM/COUNT这些运算可以针对一个数据表(记录集合)实施。
分组运算的结果是一批分组子集,那么每个子集上也可以应用聚合运算,这也就是SQL的分组运算了。其实针对全集的聚合运算也可以理解为只分了一个组的特殊分组(也是个完全划分),这样理解后,我们可以认为聚合运算总是发生在分组运算之后(但分组运算后不一定总有聚合运算,前面已说过)。而且,还可以反过来说,只要被认定为是聚合运算(符合前述定义的运算),就一定可以用在分组之后。我们在下面会看到,这个理解将大幅度地扩展分组+聚合运算的应用范围。
除了这五种聚合运算外,有的数据库还提供了方差、标准差等聚合函数,其性质和这五种差不多,可以称为是常规的聚合运算。我们下面来研究业务上有意义的其它形式聚合运算。
1、返回记录
上述的常规聚合都是针对数值的运算,特别地,对于结构化数据来说,是针对某个字段(或表达式)的运算,返回值也是这些数值的运算结果。但有时候我们关心的不是结果数值本身,而是与结果数值相关的信息。
比如我们想从日志表中找出某个用户第一次登录时用的IP地址,而不是登录时刻。用标准SQL写这个运算大概是这样:
SELECT ip_address FROM LogTable WHERE user=? AND logintime=
(SELECT MIN(logintime) FROM LogTable WHERE user=?)
用子查询先计算出该用户的第一次登录的时刻,再查找出该时刻时用到的IP地址,这要把数据集遍历两次。
ORACLE提供了一个KEEP函数,可以不用子查询写出这样的运算:
SELECT MIN(ip_address) KEEP(DENSE_RANK FIRST ORDER BY logintime) FROM LogTable WHERE user=?
但是,我们关心的可能还不止是IP地址,还可能是日志表中的其它字段,比如所用浏览器、是否移动端等,其实就是关心最小值对应的那条完整记录。而由于SQL缺乏离散性,即使有KEEP函数,也不容易写出这种运算,要么每个字段分别用KEEP,要么还是用子查询遍历两次,都很繁琐。
如果有一个用于返回最大值/最小值对应记录而非值本身的聚合函数,那这个运算写起来就简单了,也只要遍历一次:
=LogTable.select(user=?).minp(logintime)
像前面说的,这样的聚合运算还可以用在GROUP中,比如找出每个用户首次登录的日志记录
=LogTable.group(user).(~.minp(logintime))
类似地,还可以有maxp方法用于返回最大值对应记录。
日志记录常常本来就是按事件发生时刻有序,利用这个特点时就不需要再用比较来计算最小值了,而是直接取出第一条即可。
=LogTable.select(user=?).first() // 聚合函数first返回第1个成员
在分组中也可以:
=LogTable.group(user).(~.first())
当然实际编码时也可以直接取集合成员,这里写成first只是为了强调可以把取某成员的动作理解为一种聚合运算。
这种运算较为常用,我们可以为group函数做一个选项:
=LogTable.group@1(user)
SQL建立在无序集合概念上,无法保证返回记录的次序,想写出这种运算就又需要人为制造序号后再用过滤条件来做。
2、返回集合
我们把上面的问题改一下:找出一群人中年龄最小的那些人的姓名。
和前述问题不同的是,同一个用户不会有多个相同的登录时间,但一批人中则可能有年龄相同的人,年龄最小的人可能不止一个。minp函数的返回值应当是一个集合才合理。
仔细观察我们在文章开始对聚合运算的定义,我们会发现,其实返回单值的要求并无必要,只要参数是集合,随便返回什么东西都可以认定为是聚合运算,这种定义下,返回集合的minp/maxp仍然可以作为聚合运算处理。
需要返回集合的聚合运算中,更常见是topN。
SQL并不把topN理解成一种聚合运算,而只是返回结果集时的一种修饰符。原理上,SQL会先把完整的结果集计算出来,然后再只取前N条返回。topN总是在排序动作之后,大集合的排序是个时间成本很高的动作,但其实只做topN并不需要全集的排序。这时候只能依靠数据库在工程上的优化,但这并不是总能做好的。另外,只作为结果集的修饰,那就不能把这个运算实施到分组子集上了,而且运算复杂化后优化也很难做了。
把topN理解成聚合运算后,一切都变得很轻松
=a=LogTable.select(user=?).top(logingtime,-2), a(2)-a(1) //某用户最后的两次登录时间间隔
=LogTable.groups(user;(a=~.top(logintime,-2),a(2)-a(1))) //每个用户最后的两次登录时间间隔
而且实施计算也不需要刻意地工程上优化,在分组后使用也能获得高性能。
topN也有返回记录的情况,即取出某个字段(表达式)在前N名的对应记录。和minp/maxp类似地,这需要再设计一个函数。
同样的,有序情况也会发生,像前面的日志计算,如果假定日志表已经针对事件时刻有序,那可以不必再用topN去做比较运算了。
=a=LogTable.select(user=?).last(2),a(2)-a(1) //聚合函数last(n)返回最后n个成员
=LogTable.groups(user;(a=~.last(2),a(2)-a(1)))
类似地,last函数也可以写成取集合成员的形式。
这里讨论了非常规聚合的两种常见情况,都是SQL不易支持的。当然按照定义还会有更多形式的聚合运算,即使这两种情况也还会有许多变种,比如取出排序位置居中的成员、取出针对某一字段的唯一值(DISTINCT)集合等。深入理解聚合运算及其与分组运算的关系,将能够扩展这些运算的应用范围,对计算的描述和实施都有不小的意义。
数据分析咨询请扫描二维码
在准备数据分析师面试时,掌握高频考题及其解答是应对面试的关键。为了帮助大家轻松上岸,以下是10个高频考题及其详细解析,外加 ...
2024-12-20互联网数据分析师是一个热门且综合性的职业,他们通过数据挖掘和分析,为企业的业务决策和运营优化提供强有力的支持。尤其在如今 ...
2024-12-20在现代商业环境中,数据分析师是不可或缺的角色。他们的工作不仅仅是对数据进行深入分析,更是协助企业从复杂的数据信息中提炼出 ...
2024-12-20随着大数据时代的到来,数据驱动的决策方式开始受到越来越多企业的青睐。近年来,数据分析在人力资源管理中正在扮演着至关重要的 ...
2024-12-20在数据分析的世界里,表面上的技术操作只是“入门票”,而真正的高手则需要打破一些“看不见的墙”。这些“隐形天花板”限制了数 ...
2024-12-19在数据分析领域,尽管行业前景广阔、岗位需求旺盛,但实际的工作难度却远超很多人的想象。很多新手初入数据分析岗位时,常常被各 ...
2024-12-19入门数据分析,许多人都会感到“难”,但这“难”究竟难在哪儿?对于新手而言,往往不是技术不行,而是思维方式、业务理解和实践 ...
2024-12-19在如今的行业动荡背景下,数据分析师的职业前景虽然面临一些挑战,但也充满了许多新的机会。随着技术的不断发展和多领域需求的提 ...
2024-12-19在信息爆炸的时代,数据分析师如同探险家,在浩瀚的数据海洋中寻觅有价值的宝藏。这不仅需要技术上的过硬实力,还需要一种艺术家 ...
2024-12-19在当今信息化社会,大数据已成为各行各业不可或缺的宝贵资源。大数据专业应运而生,旨在培养具备扎实理论基础和实践能力,能够应 ...
2024-12-19阿里P8、P9失业都找不到工作?是我们孤陋寡闻还是世界真的已经“癫”成这样了? 案例一:本硕都是 985,所学的专业也是当红专业 ...
2024-12-19CDA持证人Louis CDA持证人基本情况 我大学是在一个二线城市的一所普通二本院校读的,专业是旅游管理,非计算机非统计学。毕业之 ...
2024-12-18最近,知乎上有个很火的话题:“一个人为何会陷入社会底层”? 有人说,这个世界上只有一个分水岭,就是“羊水”;还有人说,一 ...
2024-12-18在这个数据驱动的时代,数据分析师的技能需求快速增长。掌握适当的编程语言不仅能增强分析能力,还能帮助分析师从海量数据中提取 ...
2024-12-17在当今信息爆炸的时代,数据分析已经成为许多行业中不可或缺的一部分。想要在这个领域脱颖而出,除了热情和毅力外,你还需要掌握 ...
2024-12-17数据分析,是一项通过科学方法处理数据以获取洞察并支持决策的艺术。无论是在商业环境中提升业绩,还是在科研领域推动创新,数据 ...
2024-12-17在数据分析领域,图表是我们表达数据故事的重要工具。它们不仅让数据变得更加直观,也帮助我们更好地理解数据中的趋势和模式。相 ...
2024-12-16在当今社会,我们身处着一个飞速发展、变化迅猛的时代。不同行业在科技进步、市场需求和政策支持的推动下蓬勃发展,呈现出令人瞩 ...
2024-12-16在现代商业世界中,数据分析师扮演着至关重要的角色。他们通过解析海量数据,为企业战略决策提供有力支持。要有效完成这项任务, ...
2024-12-16在当今数据爆炸的时代,数据分析师是组织中不可或缺的导航者。他们通过从大量数据中提取可操作的洞察力,帮助企业在竞争激烈的市 ...
2024-12-16