mssql 循序渐进累加函数

1.如下图,构建初始降雨量

2.对这些降雨量进行排序,大部分的操作这一步可以省略,用不到包括后续的rank

3.观察上图,如果我们要累加,其实就是当天加上这一天之前的降雨量之和,所以可以写出如下的

附上sql代码如下:

SELECT row_number () OVER (ORDER BY 时间) rank, *
  INTO #t
  FROM (SELECT ‘2016-08-28‘ 时间, 200 降雨量
        UNION ALL
        SELECT ‘2016-08-29‘ 时间, 0 降雨量
        UNION ALL
        SELECT ‘2016-08-30‘ 时间, 500 降雨量
        UNION ALL
        SELECT ‘2016-08-31‘ 时间, 700 降雨量
        UNION ALL
        SELECT ‘2016-09-01‘ 时间, 100 降雨量
        UNION ALL
        SELECT ‘2016-09-02‘ 时间, 0 降雨量
        UNION ALL
        SELECT ‘2016-09-03‘ 时间, 900 降雨量) a

SELECT a1.时间, a1.降雨量, sum (a2.降雨量) 累计降雨量
  FROM #t a1 INNER JOIN #t a2 ON a2.rank <= a1.rank
GROUP BY a1.时间, a1.降雨量
ORDER BY a1.时间

DROP TABLE #t

4.也可以不需要利用row_number() 而直接利用日期作为条件,效果跟3一样:

代码:

SELECT *
  INTO #t
  FROM (SELECT ‘2016-08-28‘ 时间, 200 降雨量
        UNION ALL
        SELECT ‘2016-08-29‘ 时间, 0 降雨量
        UNION ALL
        SELECT ‘2016-08-30‘ 时间, 500 降雨量
        UNION ALL
        SELECT ‘2016-08-31‘ 时间, 700 降雨量
        UNION ALL
        SELECT ‘2016-09-01‘ 时间, 100 降雨量
        UNION ALL
        SELECT ‘2016-09-02‘ 时间, 0 降雨量
        UNION ALL
        SELECT ‘2016-09-03‘ 时间, 900 降雨量) a

SELECT a1.时间, a1.降雨量, sum (a2.降雨量) 累计降雨量
  FROM #t a1 INNER JOIN #t a2 ON a2.时间 <= a1.时间
GROUP BY a1.时间, a1.降雨量
ORDER BY a1.时间

DROP TABLE #t

为什么3这样写能查出来我们想要的样子,我们只是用前三天就可以看到

可以观察到,小于8月28号的记录是8月28,小于8月29的是28和29两天,我们把这些数据捏在一起,就能轻松地对作为a1日期进行分组累加,最终得到自己想要的数据。

时间: 2024-10-08 11:29:58

mssql 循序渐进累加函数的相关文章

MSSQL Sql加密函数 hashbytes 用法简介

转自:http://www.maomao365.com/?p=4732 一.mssql sql hashbytes 函数简介 hashbytes函数功能为:返回一个字符,通过 MD2.MD4.MD5.SHA.SHA1.SHA2_256.SHA2_512方式加密后的返回值 hashbytes(‘参数1’,’参数2’) 参数1:输入加密类型 例:MD5参数2:输入待加密的字符串(加密字符串最大值为 8000字节)返回值:返回值最大为8000字节注意事项:当输入加密类型,异常时,返回NULL 二.ms

[MSSQL]采用pivot函数实现动态行转列

环境要求:2005+ 在日常需求中经常会有行转列的事情需求处理,如果不是动态的行,那么我们可以采取case when 罗列处理. 在sql 2005以前处理动态行或列的时候,通常采用拼接字符串的方法处理,在2005以后新增了pivot函数之后,我可以利用这样函数来处理. 1.动态SQL注入式判断函数 --既然是用到了动态SQL,就有一个老话题:SQL注入.建一个注入性字符的判断函数. CREATE FUNCTION [dbo].[fn_CheckSQLInjection] ( @Col nvar

MSSQL 日期操作函数 总结

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER FUNCTION [dbo].[ufn_getDateOfWeek] (@Date Datetime) RETURNS nchar(1) AS BEGIN DECLARE @returnValue nchar(1); SET @returnvalue = case datepart(dw,@Date) when 2 then '一' when 3 then '二' when 4 then '三

ipv6地址累加函数

好不容易写的,指不定什么时候用的上. #include <stdio.h> #include <arpa/inet.h> int main() { int i; int ret; struct in6_addr addr6; char str[INET6_ADDRSTRLEN] = {0}; ret = inet_pton(AF_INET6, "ff02::12", &addr6); if (ret != 1) { perror("inet_p

MSSQL注入语句

(1)                                                                                  判断数据库类型:                                                                                   Access:  aNd aSc(cHr(97))=97 and exists(select id from MSysAccessObjects)

MYSQL基础03(日期函数)

工作中对日期的处理是经常遇到的,需求可能多种多样,因此重点介绍. 1.获取当前日期 select NOW() -- 结果:2015-10-28 22:41:11 select NOW(),SLEEP(3),NOW() -- 结果 2015-10-28 22:43:34 0 2015-10-28 22:43:34 SELECT SYSDATE(),SLEEP(3),SYSDATE() -- 结果 2015-10-28 22:46:48 0 2015-10-28 22:46:52 -- NOW()是

C#函数式编程之标准高阶函数

何为高阶函数 大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的.只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内.那么我们就将这类函数叫做高阶函数.但是今天我们的标题并不是高阶函数,而是标准高阶函数,既然加上了这个标准,就意味着在函数式编程中有一套标准的函数,便于我们每次调用.而今天我们将会介绍三个标准函数,分别为Map.Filter.Fold. Map 这个函数的作用就是将列表中的每项从A类型转换到B类型,并形成一个新的类型.下面我们可以

序列模式关联规则:使用arulesSequences包中的cspade函数

数据抽象 序列(sequence):表示一个完整的信息流. 数据项(item):序列中最小组成单位的集合 事件(event):通常使用时间戳来表示,用于标识同一个序列内不同数据项之间的前后顺序关系. 在网站分析中,可以使用序列模式的关联分析来研究用户的点击行为流,并衡量页面的体验以及易用性效果. (该实例来自 李明 <R语言与网站分析>中例子) 读取数据 # (1)使用read.fwf函数读入文件 tmpp<-read.fwf("~\\anonymous-msweb.data&

函数拼接记录集某个字段,逗号分隔

数据表:user id name group_id 1 张三 1 2 李四 1 3 王五 2 1. mysql.sqlite:group_contact函数: select group_concat(id) ids, group_id from user group by group_id 结果: ids group_id 1,2 1 3 2 2.mssql:stuff函数 + FOR XML PATH select stuff((select ','+convert(varchar(25),