不可不知的SQL绝技之无中生有_SQL

                            (来自新浪)

 

高中的时候,开始对中国的传统武术感兴趣,先后练习了一些八卦掌,五禽戏,太极拳。每到暑假,总是召集一班小弟(小一届的村上人)一起讨论,切磋(向来都有建社群的底子)。

 

当时的网络远没今天这么发达,我记得进入学校的机房,都需要带上脚套,系统用的还是95,98。动不动经常蓝屏的那种。

 

我们这帮“习武”之人,天天做的事情,就是看甄子丹的《精武英雄》,或者金庸老爷子的《笑傲江湖》。除了研习拳脚功夫之外,小伙伴们还额外会从报纸上撕下一两页少林功夫的新闻,待到周末时,一起探讨。

 

好在高中我们有很多时间(托素质教育的福)可以自由活动,除了运动场,篮球馆,实验室,还有图书馆。

 

某天,我看完了《双城记》还是《围城》之后,往图书馆的后几排深入的走了走。平时大家都被教育要看前几排的正书(语数外,文人文集),所以后排很少有人去。但那天,脚没听使唤,我还是外后排径直走过去了。就像《纳尼亚》中几个淘气的小朋友一样,非要逛遍所有的房间不可。

 

在吃灰的书架上,散落的几本中学生体育报刊中,发现了李小龙的截拳道。看着精瘦的龙哥,拿着双节棍,瞬间明白,甄子丹的《精武英雄》是在致敬龙哥。

 

听说过南拳北腿,对截拳道真是闻所未闻。好奇心将我的本能逼了出来,花了一下午的时间,把这本截拳道看完了。从来只听说过龙哥手脚灵活,但没想到一个粗人却能发明了一种武术体系,且被近代流行的搏击比赛运动(综合格斗)及(MMA)尊崇为第一先驱者。看完这本书,才发现了他的奥秘,整本书可归纳为一个字,那就是“借”。

 

截拳道借鉴了咏春,拳击,击剑,和道家思想,以无形的招式去化解和反击对手,能将武术精神阐述出如此哲学特征的龙哥,真不是一般人。

 

我在哔哩哔哩上找到了当年他24岁面试福克斯的一个录像,牛人在很早之前就很牛了。嗯,英语也超级棒!

 

https://www.bilibili.com/video/av2497288/

 

不可不知的SQL绝技之无中生有_SQL_02

 

 

那当然,今天要讨论的问题,其实和李小龙也有些关系。得益于我们SQL微信群读者的讨论,我发现其实编程和武术也很类似。

 

一开始,我们要修炼CRUD的语法,要熟悉每个招式,动作的要领以及缺陷,让我们看上去更专业。逐渐地,我们开始强调实现的优雅和高效,让SQL代码在实战中得到更有效的构建。最后,我们希望每次代码都能带来思想的升华,不仅仅是解决当下的业务问题,在未来的场景中,也能迅速将之前优雅的解决方案,运用过来。

 

 

我们微信群上周有个问题是这样的 :需要统计每5年的出生人数。比如1991到2020之间,每5年的出生人数的趋势变化。

 

抛开种种其他因素,我们揭开问题的本质,就是求解每5个连续数字的断点问题。之前在本号有个连续生成100年数据的解答,不知道大家是否还记得。老读者应该都还有印象,最重要的一环就是运用了数字辅助表(Tally Table)

 

再复习一下:

 

0 秒实现 100 年数据的自动生成

 

将此文中的脚本,提炼出来:

 

不可不知的SQL绝技之无中生有_SQL_03

 

 

既然问题的本质在于求解每5个连续数字的断点,配合上面的连续数字生成脚本,修改下实现,我们就可以得到连续生成一段时间,比如2010到2016年,且每过5年做一个断点的方法:

 

不可不知的SQL绝技之无中生有_SQL_04

 

不可不知的SQL绝技之无中生有_SQL_05

 

不可不知的SQL绝技之无中生有_数据库_06

 

 

我们将2010到2016年,每5年做一次断点,即2010,2011,2012,2013,2014 为第一个5年,2015,2016为第二个五年,最终得到这个通用的解决方法。我们验证下结果:

 

不可不知的SQL绝技之无中生有_SQL_07

 

所以本题最核心的方法,就是对一系列基础问题的借鉴,在这些基础方法之上,加以综合,最后解决了。

 

当然,每个人的思维不可能都一样,可能你在你的成长中,获得了一些独到的见解,你会有自己的解法,而且比我这个方法更好,这就是属于你的财富了。

 

不可不知的SQL绝技之无中生有_数据库_08

End

不可不知的SQL绝技之无中生有_SQL_09