10

面向集合的思维编写SQL(实例-手动实现开窗函数)

 4 years ago
source link: https://ask.hellobi.com/blog/Matthew112/36477
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

不少学习SQL的同学,往往在语法和函数上下了很大的功夫,其实SQL也是有自己的编程的思想和灵魂的,而运用面向集合的思维去编写SQL,更是个”有趣的灵魂“。例如大家在使用Hive、Oracle、MSSQL等数据库产品时,对开窗函数肯定是耳熟能详的。但是,不依赖具体的数据库(例如在MySQL数据库中是没有开窗的),我们能否用标准SQL进行实现呢?

接下来,我们在实例中运用面向集合的思维,用两部分内容,一点点的解决这个问题:

第一部分:初识集合思维

1.场景与需求:

我们有如下的一列价格数据, 现在有这样一个需求,对其实现RANK()排序

3ayENnm.png!web

2.SQL实现:

我先展示代码:

baUb6v3.png!web

查询结果如下:

Nn2YVvZ.png!web

3.SQL解读:

现在返回头看代码,括号中的SQL是计算rank排名的核心,也是面向集合思维的运用,我们用一张图来展示一下:

uEBNNnm.png!web

同理若要实现DENSE_RANK(),仅仅修改一处即可,即:count(distinct P2.price),大家可以自己实际操作一下。

第二部分:再进一步,实现开窗

1.场景与需求:

我们对上一个场景的表进行修改,增加一个产品名称字段,展示出产品的历史价格记录(此处省去时间字段,大家领会精神就好...)。

我们现在针对产品名称进行组的划分,然后计算组内的Rank排名。

VRn2YvY.png!web

2.SQL实现(关联子查询):

我先展示代码:

nqqMjeE.png!web

查询结果如下:

3Uru6na.png!web

3.SQL解读:

增加的"P1.name = P2.name"条件,将集合内部进行分组,产生如下效果:

[[产品1集合],[产品2集合],[产品3集合],[产品4集合]]

总结:

本文仅是面向集合思维编写SQL的冰水一角,面向集合的思维,让SQL处理数据不仅仅局限于行列之间。

/*原创,转载请联系!*/

nMRZji7.png!web

本文由Max_Leo 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK