SQL:数据与运算的融合体(附用一条语句实现时间序列的增量运算)
Posted 书圈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL:数据与运算的融合体(附用一条语句实现时间序列的增量运算)相关的知识,希望对你有一定的参考价值。
SQL语言是结构化数据处理最常用的语言了,主要的规范从最早的SQL/86(SQL1)、SQL/92(SQL2)、SQL/99(SQL3)到SQL/2008、SQL/2016,其功能不断增强,从最初的简单规范到现在对文本、图像、数据挖掘、空间数据等提供统一的访问方式,但一直忠诚地支持数据库系统,为数据与运算的融合体提供了优秀的编程方法。
本文就介绍一个利用SQL语言来实现数据库记录前后记录运算的方法。
假设有一张表 abc,其结构和数据如图所示,像每个城市每天的空气质量数值、每个学校每天的上课学生数等,都与这个表结构类似。在数据分析中,我们要计算前后两天n1,n2,n3的数值增量或增比,显然用一个简单的SQL语句是无法实现的。
这个需求实际上是一种时间序列的运算,通常我们会想到用SQL中的CURSOR来循环运算,但是多次反复的数据表查询其计算效率很低,特别是在表比较大的情况下。为此,我们可以利用虚拟表的特性。
首先构建用下面的语句构建两个表a,b,注意这里增加了一个新的列表示数据的行号id,是按时间排序的。
select a, hdate, n1, n2,n3,
row_number() over (order by hdate desc) as id
from abc where a='x0001'
那么接下来就可以利用这两张表的行号进行连接运算,并求得相关数值的增量。如下:
select a.a, a.hdate,
a.n1-b.n1, --计算增量
a.n2-b.n2, --计算增量
a.n3-b.n3 --计算增量
from
(select a, hdate, n1, n2,n3,
row_number() over (order by hdate desc) as id
from abc where a='x0001') as a
inner join
(select a, hdate, n1, n2,n3,
row_number() over (order by hdate desc) as id
from abc where a='x0001' ) as b
on a.id = b.id-1
order by a.a
以下是增量计算结果:
优惠购书码:
图文来自网络、如涉及版权问题,请联系我们以便处理。文章内容纯属作者个人观点,不代表本网观点。
以上是关于SQL:数据与运算的融合体(附用一条语句实现时间序列的增量运算)的主要内容,如果未能解决你的问题,请参考以下文章
有一张数据表TABLE ,现要求筛选出在2015年5月至2015年6月的数据并计算该数据的数量,用一条SQL语句实现