面向集合的思维编写SQL(实例-手动实现开窗函数)
2016 年 2 月 18 日
不少学习SQL的同学,往往在语法和函数上下了很大的功夫,其实SQL也是有自己的编程的思想和灵魂的,而运用面向集合的思维去编写SQL,更是个”有趣的灵魂“。例如大家在使用Hive、Oracle、MSSQL等数据库产品时,对开窗函数肯定是耳熟能详的。但是,不依赖具体的数据库(例如在MySQL数据库中是没有开窗的),我们能否用标准SQL进行实现呢?
接下来,我们在实例中运用面向集合的思维,用两部分内容,一点点的解决这个问题:
第一部分:初识集合思维
1.场景与需求:
我们有如下的一列价格数据, 现在有这样一个需求,对其实现RANK()排序 :
2.SQL实现:
我先展示代码:
查询结果如下:
3.SQL解读:
现在返回头看代码,括号中的SQL是计算rank排名的核心,也是面向集合思维的运用,我们用一张图来展示一下:
同理若要实现DENSE_RANK(),仅仅修改一处即可,即:count(distinct P2.price),大家可以自己实际操作一下。
第二部分:再进一步,实现开窗
1.场景与需求:
我们对上一个场景的表进行修改,增加一个产品名称字段,展示出产品的历史价格记录(此处省去时间字段,大家领会精神就好…)。
我们现在针对产品名称进行组的划分,然后计算组内的Rank排名。
2.SQL实现(关联子查询):
我先展示代码:
查询结果如下:
3.SQL解读:
增加的”P1.name = P2.name”条件,将集合内部进行分组,产生如下效果:
[[产品1集合],[产品2集合],[产品3集合],[产品4集合]]
总结:
本文仅是面向集合思维编写SQL的冰水一角,面向集合的思维,让SQL处理数据不仅仅局限于行列之间。
/*原创,转载请联系!*/