简化SQL式计算之行间计算

在数据库应用开发中,我们经常需要面对复杂的SQL式计算,行间计算就是其中一种,比如用每月的销售额除以上月的销售额,求比上期,或用每月销售额除以去年同月的销售额,求同期比。有些数据库没有提供SQL2003标准的窗口函数(或支持的不完备),完成行间计算就需要更换思路使用连接(join)运算替代,不仅难以理解而且运算效率低下。即使可以使用窗口函数仍要面临嵌套子查询等问题,SQL语句仍较为冗长。而使用集算器可以用更简单直观的代码来实现行间计算,下面用一个例子来说明。

表sales存储着多年的订单数据,请根据该表计算出指定时间段内各月份的销售额比上期和同期比。部分源数据如下:

集算器代码:

A1:按时间段从数据库查询数据,begin和end是外部参数,比如begin=”2011-01-01 00:00:00″,end=”2014-07-08 00:00:00″。部分查询结果如下:

A2=A1.groups(year(OrderDate):y,month(OrderDate):m;
sum(Amount):mAmount)

这句代码对订单按照年份和月份进行分组,并汇总求得每月的销售额。函数groups可进行分组汇总运算,其参数分为两部分,分号之前是分组表达式,即:year(OrderDate):y,month(OrderDate):m,分号之后是汇总表达式,即sum(Amount):mAmount。汇总后的字段命名为mAmount。部分计算结果如下:

A3=A2.derive(mAmount/mAmount[-1]:lrr)

这句代码在A2基础上增加一个新的字段lrr,即按月比上期,其表达式为mAmount/mAmount[-1]。集算器可以用 [N]或[-N]来表达相对于当前记录之后的第N条记录,或之前的第N条记录,因此代码中mAmount代表当期销售额,mAmount[-1]代表上期销售额。计算结果如下:

需要注意的是,初始月份的比上期值为空(即2011年1月)。

A4=A3.sort(m)

这句代码将A3按照月、年排序,以便计算同期比。完整的代码应当是:=A3.sort(m,y),由于A3本来就是按年排序的,因此只需按月排序就可以达到目的,即A3.sort(m),这样性能也高。部分计算结果如下:

A5=A4.derive(if(m==m[-1],mAmount/mAmount[-1],null):yoy)

这句代码在A4的基础上增加一个新的字段yoy,即月销售额的同期比,其表达式为if(m==m[-1],mAmount/mAmount[-1],null),这表示月份相同时才进行同期比计算。函数if有三个参数,其中m==m[1-]为布尔表达式,当该条件为True时,返回mAmount/mAmount[-1],当该条件为False时,返回null。需要注意的是,初始年份(即2011年)各月份的同期比衡为空。部分结果如下:

如果观察不便,可以加一行代码A6=A5.sort(y:-1,m),即将A5按照年逆序月正序进行排序。需要注意的是,数据只到2014年7月为止。结果如下:

另外,集算器可被报表工具或java程序调用,调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 08:33:32

简化SQL式计算之行间计算的相关文章

简化SQL式计算之固定排序

在数据库应用开发中,我们经常要面对复杂的SQL式计算,固定排序就是其中一种.固定排序不是按照某个字段升序或降序排序,而是有着固定的顺序,比如按照2,3,1的顺序排序,或者按照"DSGC","TAS","GC","HU"的顺序来排序.如果允许在数据库建一张表来存储依据,那就可以用join语句来实现排序.但很多时候排序依据是变动的,或者数据库不能建表,这时就需要先union再join,或者用decode函数.排序依据比较短的时候可

集算器简化SQL式计算之组内运算

在开发数据库应用时,经常会遇到分组后针对组内数据的运算问题,如:列出近3年每年都发表过论文的学生名单,统计全部参加了历次培训的员工,选出每位客户的高尔夫成绩最高的三天等等.SQL完成这类运算较为复杂,一般需要嵌套多层,导致代码难以理解和维护.而集算器擅长表达这类组内计算,且很容易和JAVA或报表工具集成.下面用一个例子来说明. 根据数据库表SaleData统计出2013年中,每个月销售金额均排在前20名的客户名称.SalesData的部分数据如下: 想解决这个问题,需要选出2013年的销售数据,

SQL Server-聚焦计算列或计算列持久化查询性能(二十二)

前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非持久化计算列性能要好 我们开始创建两个一样的表并都插入100条数据来进行比较,对于计算列我们重新进行创建计算列和非计算列持久化. CREATE TABLE [dbo].[ComputeColumnCompare] (ID INT, FirstName VARCHAR(100), LastName C

Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL

Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3. 变量的存储,储存在变量池里Map(varName,varVal)1 1.3.1. 复合变量1 1.4. 变量类型简化: 字符串 数字,  bool1 1.5. 变量自动隐式转换2 1.6. 类型推导2 2. 参考 复合变量2 1.1. $ 美元字符, php 黑头 1.2. 默认变量的范围和声明

实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积

(1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Square) 矩形的子类生成几个不同的形状对象,放在一个Shape类型的数组里,分别求每个形状的周长和面积.如果形状对象是一个矩形,且不是正方形,则计算长宽差. 1 package com.tiger.practice; 2 3 class Shape { 4 5 public double leng

云托管,边缘物理计算&托管物理计算,你所需要了解的……

随着业务发展,传统数据中心建设复杂性越来越高,基建的管理.设备的繁杂.人力成本的提升,是否让你的运维成本越来越高?企业生产效率却越来越低? 业务快速发展,设备采购周期冗长,大量采购造成CAPEX过重,是否让你的资产成本?折旧成本越来越高?企业生产效率却越来越低? 新业务上线,业务架构越来越复杂,需要各种新的技术及设备的支持,你是否需要分析指标纬度太多?投入产出分析无从下手?还需面对技术过时风险? 以上这些问题,均引出一个近期很热的话题"CAPEX转OPEX"--众所周知CAPEX支出会

2019中国无线技术大会,研讨5G环境下边缘计算、雾计算、云化数据中心发展趋势

随着5G正式进入部署阶段,我们将进入5G和物联网时代. 众所周知,让计算资源更接近用户端,对延迟敏感的应用而言是至关重要的.多接入边缘计算/雾计算的出现正是让计算资源更靠近用户,减轻由于网络流量带来的延迟压力.这让诸如自动驾驶汽车.智能城市以及其他垂直行业的基于物联网和工业互联网的应用成为可能.而成功部署5G也需要多方面的技术创新. 即将举办的本届中国无线技术大会之5G/MEC/算力网络论坛将围绕着5G系统建设.云及微云组成的分布式架构.边缘计算以及5G行业应用展开研讨. 时间:2019年12月

一条SQL搞定信息增益的计算

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 周东谕,2011年加入腾讯,现任职于腾讯互娱运营部数据中心,主要从事游戏相关的数据分析和挖掘工作. 信息增益原理介绍 介绍信息增益之前,首先需要介绍一下熵的概念,这是一个物理学概念,表示"一个系统的混乱程度".系统的不确定性越高,熵就越大.假设集合中的变量X={x1,x2-xn},它对应在集合的概率分别是P={p1,p2-pn}.那么这个集合的熵表示为: 举一个的例子:对游戏活跃用户进行分层,分为

SQL Server ->> Computed Column(计算列)

Computed Column(计算列)是自SQL Server 2005开始就有的特性.计算列的定义是一个表达式.表达式可以是非计算列,常量,函数间的组合.但是不可以是子查询. 计算列数据固化 默认情况下计算列的数据是存储在磁盘上,仅当计算列被查询引用是才进行实时计算.只在计算列在定义是添加了PERSISTED关键词是才将数据固化. 计算列上创建索引或者作为分区函数的引用列 计算列上是运行创建索引和作为分区函数的引用列.但是必须指定PERSISTED关键词. 用法其实很简单.那么这里有些问题.