SQL描述(2)
很久之前就想写出来,就是因为自己太懒,憋了怎么久。本文关于使用ORACLE分析函数对一些经济指标进行计算。表indi_value有3个关键的字段:indi_date,indi_value,indi_id分别对应 指标日期,指标值,指标ID。这个表中保存了很多种类的经济指标,如CPI,RPI,GDP,这些指标通过 指标ID来标识。下面是针对CPI做的处理,公式如下:

公式说明:将2010年1月份当作基期。分别计算基期前后的定基价格指数。直接看代码
with base as ( select indi_date,indi_value
from indi_value
-- 获取20060101 - 20131101区间内要计算的数据
where indi_id='C0A0102' and indi_date between '20060101' and '20131101'
),
---获取大于基期的数据,数据按日期升序,并且使基期=100,往后的值都为空,然后通过行间计算,进行填补
up as (select indi_date,indi_value,
case when indi_date like '201001%'
then 100 else null end as v,rank() OVER(order by indi_date) as d
from base
where indi_date between '20100101' and '20131101'),
upx as (select d,v
from up model
dimension by (d)
measures (indi_value,v)
RULES UPDATE
(
V[d>1]=v[cv(d)-1]*(1+(indi_value[cv(d)]-100)/100) --大于基期的计算公式
)
),
--获取小于基期的数据,结尾日期要能够将基期数据包含到要计算的数据中,数据按日期倒序,
--并且使基期=100,往后的值都为空,然后通过行间计算,进行填补
down as (select indi_date,indi_value,
case when indi_date like '201001%'
then 100 else null end as v,rank() OVER(order by indi_date desc) as d
from base
where indi_date between '20060101' and '20100201'),
downx as (select d,v
from down model
dimension by (d)
measures (indi_value,v)
RULES UPDATE
(
V[d>1]=v[cv(d)-1]/(1+(indi_value[cv(d)-1]-100)/100) --小于基期的计算公式
)
)
select u.indi_date,null as v,null as r,x.v as b
from upx x join up u on x.d=u.d
union
select d.indi_date,null as v,null as r, x.v as b
from downx x join down d on x.d=d.d
以上语句的结果即为对CPI的定基价格指数计算结果。其中 C0A0102是 CPI在表中的指标ID。语句基本上分位4部分
第一部分:主要是获取要计算的时间区间内的所有数据,并放到一个名叫base的临时表中。
with base as ( select indi_date,indi_value
from indi_value
-- 获取20060101 - 20131101区间内要计算的数据
where indi_id='C0A0102' and indi_date between '20060101' and '20131101'
),
第二部分:计算大于基期的那部分数据
---获取大于基期的数据,数据按日期升序,并且使基期=100,往后的值都为空,然后通过行间计算,进行填补
up as (select indi_date,indi_value,
case when indi_date like '201001%'
then 100 else null end as v,rank() OVER(order by indi_date) as d
from base
where indi_date between '20100101' and '20131101'),
upx as (select d,v
from up model
dimension by (d)
measures (indi_value,v)
RULES UPDATE
(
V[d>1]=v[cv(d)-1]*(1+(indi_value[cv(d)]-100)/100) --大于基期的计算公式
)
)
第三部分:计算小于基期的那部分数据,原理同第二部分。
第四部分:将第二,第三部分的计算结果整合起来
select u.indi_date,null as v,null as r,x.v as b
from upx x join up u on x.d=u.d
union
select d.indi_date,null as v,null as r, x.v as b
from downx x join down d on x.d=d.d
其中第二,第三部分又可以分为2个步骤。
(1)是还是获取要计算的数据,并添加一列作为计算结果,且基期对应的值为100。添加一列排序号作为(2)步的取值下标。
(2)使用oracle提供的行间计算函数 model 来根据(1)中的indi_value,和 第一行的基期结果100来计算第二行的定基价格指数。
这样就会一行一行的计算下去,后一行的结果总是基于前一行的值来计算。(1)中的列 d 可以起类似于数组的作用。
measures 后面的 rules update是可以去掉的。
SQL描述(2)的更多相关文章
- 用SQL描述树
/*40条(1层) SELECT COUNT(*) FROM t01_mwfl WHERE AZFSDM=01 AND LEVEL=1 START WITH PID=0 CONNECT BY PRIO ...
- SQL Server-分页方式、ISNULL与COALESCE性能分析(八)
前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解,Always to review the basics. ...
- 如何写复杂的SQL
经常有人问我那非常复杂的sql是怎么写出来的,我一直不知道该怎么回答. 因为虽然我写这样的sql很顺手,可是我却不知道怎么告诉别人怎么写. 很多人将这个问题归结为天赋,我却不这么看,我 ...
- MyBatis基础入门《十七》动态SQL
MyBatis基础入门<十七>动态SQL 描述: >> 完成多条件查询等逻辑实现 >> 用于实现动态SQL的元素主要有: > if > trim > ...
- Flink table&Sql中使用Calcite
Apache Calcite是什么东东 Apache Calcite面向Hadoop新的sql引擎,它提供了标准的SQL语言.多种查询优化和连接各种数据源的能力.除此之外,Calcite还提供了OLA ...
- flyway实现java 自动升级SQL脚本
flyway实现java 自动升级SQL脚本 为什么要用Flyway 在日常开发中,我们经常会遇到下面的问题: 自己写的SQL忘了在所有环境执行: 别人写的SQL我们不能确定是否都在所有环境执行过了: ...
- 20145205 《Java程序设计》第9周学习总结
教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC目的:让Java程序设计人员在撰写数据库操作程序时可以有个统一的接口,无须依赖特 ...
- 开源GIS软件初探
谈到GIS软件,首先让我们想到的便是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品,从最初接触的version 9.2到如今的version 10.1,其发展可谓风生水起.MapInfo软件也不 ...
- hiberante入门
Hibernate 目前企业级应用一般均采用面向对象的开发方法,而内存中的对象数据不能永久存在,如想借用关系数据库来永久保存这些数据的话,无疑就存在一个对象-关系的映射过程.在这种情形下,诞生了许多解 ...
随机推荐
- 蓝桥杯 生命之树【树状dp】
生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上, 都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S, 使得对于S中的任意两个点a,b ...
- Repeater更具条件为每行数据背景填充颜色
后台代码 protected void RptPosterManager_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.I ...
- 有了 itchat, python 调用微信个人号从未如此简单(新增 py3 支持)
itchat 是一个开源的微信个人号接口. 近期完成了 py3 与文档的完善,欢迎各位使用与测试. 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人. 当然,该 api 的使用远不止 ...
- TCP/IP协议 socket
TCP/IP四层协议 TCP/IP概念 tcp/ip协议是主机接入互联网以及接入互联网的两台主机通信的标准. 数据帧概念 数据帧 |-- 包头 | |--源地址 | |--目标地址 | |--数据类型 ...
- centos7上mysql无法启动也没有日志
报错的原因就是 [root@localhost duanxinli]# journalctl -xe-- Subject: Unit mysqld.service has begun start-up ...
- xdebug php
sudo apt-get install php5-dev php5-cli #其中php5-dev为了安装xdebug所以必须安装. sudo apt-get install php5-xsl #X ...
- linux rz sz 的安装
先wget获取包wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz然后解压tar zxvf rzsz-3.48.tar.gz进入目录c ...
- Python运维开发基础04-语法基础
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现"简单 ...
- java多线程通信方式之一:wait/notify
java多线程之间的通信方式有多种: 1.wait(),notify(),notifyAll()方法;2.join()方法;3.通过volatile共享内存的方式进行线程通信的;4.interrupt ...
- soapUI参数中文乱码问题解决方法&soap UI工具进行web接口测试
soapUI参数中文乱码问题解决方法 可能方案1: 字体不支持中文,将字体修改即可: file-preferences-editor settings-select font 修改字体,改成能显示中文 ...