码迷,mamicode.com
首页 > 数据库 > 详细

mssql 循序渐进累加函数

时间:2016-09-07 01:02:26      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

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日期进行分组累加,最终得到自己想要的数据。

 

mssql 循序渐进累加函数

标签:

原文地址:http://www.cnblogs.com/zwdxcc/p/5847479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!