面向集合的思维编写SQL(8-行间数据比较)

浏览: 1644

早些时间写过一篇《Python与SQL对比实现:处理相邻记录的时间差》

https://ask.hellobi.com/blog/Matthew112/15643

面向的是工作中常见的一个业务场景:对基于时间顺序的业务数据集进行时间序列分析。

现在我们有了集合思维的加持,面对相似的问题,又会如何处理呢?


案例一

1.场景与需求:

如下图,是某公司一段时间内的销售额,用列表展示与昨日的比较结果。

image.png

2.SQL实现与解读:

case子句中使用关联子查询,判断行间比较的四种情况(头记录没有参照)

image.png

结果如下:

image.png

3.集合思维解析:

面向过程的来处理该问题的思路如下:

1.按年份递增的顺序排序。

2. 循环地将每一行与前一行的“sale”列进行比较。

面向集合来处理这个问题的思路是这样的:

在表 Sales 的基础上,再加对应存储昨天的数据的集合S2

image.png

核心的处理是使用"S2.date = date_sub(S1.date,interval 1 day)"进行偏移,并辅以"order by date"进行排序。

案例二

1.场景与需求:

针对案例一的销售数据集,如果时间轴有断裂(如受当前疫情的影响,某些日期没有营业),我们该如何处理。

image.png

2.SQL实现与解读:

image.png

这里使用自连接的方式,不产生头记录。

结果如下:

image.png

3.集合思维解析:

这里核心处理是:与当然日期相比,最近的日期,"select max(date) from sales s3 where s1.date > s3.date",集合思想与案例一相似。



个人原创,转载请联系!个人原创,转载请联系!个人原创,转载请联系!

推荐 2
本文由 Max_Leo 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册