星空网 > 软件开发 > 数据库

补充缺失日期及对应数据

数据库环境:SQL SERVER 2008R2

  有一个数据表,只有2个字段,一个是日期字段,另一个是数据字段,其中,

日期字段的日期是不连续的。要求:补全日期,对应的数据为上一个日期的数据除于7。

  现有数据如图1,

    补充缺失日期及对应数据

  实现的效果如图2(数据太多,已省略部分)

     补充缺失日期及对应数据

  实现思路:

  1.用数字辅助表补全缺失的日期

  2.将当前开始补录日期到下一个补录日期之间的日期视为一组,不包括下一个补录日期

  3.分析函数求得分组内的最大数据,并计算结果

  

  建表,导入测试数据

补充缺失日期及对应数据补充缺失日期及对应数据
CREATE TABLE test(cdate DATE,num NUMERIC(6,2))INSERT INTO test VALUES ('2015-10-03','21')INSERT INTO test VALUES ('2015-10-10','49')INSERT INTO test VALUES ('2015-10-17','147')INSERT INTO test VALUES ('2015-10-24','63')

View Code

  实现

补充缺失日期及对应数据补充缺失日期及对应数据
/*取得最小、最大日期*/WITH  x0     AS ( SELECT  MIN(cdate) AS date_begin ,            MAX(cdate) AS date_end        FROM   test       ),/*生成最小、最大日期之间的所有日期*/    x1     AS ( SELECT  DATEADD(DAY, number, date_begin) AS cdate ,            number AS rn        FROM   x0            CROSS APPLY master..spt_values sv        WHERE  sv.type = 'P'            AND sv.number <= DATEDIFF(DAY, date_begin, date_end)       ),/*和原表左连接,取到num*/    x2     AS ( SELECT  x1.cdate ,            t.num ,            rn ,            CASE WHEN t.num IS NOT NULL THEN 1               ELSE 0            END AS gp        FROM   x1            LEFT JOIN test t ON t.cdate = x1.cdate       ),/*生成分组依据*/    x3     AS ( SELECT  cdate ,            num ,            ( SELECT  SUM(gp)             FROM   x2 x             WHERE   x.rn <= x2.rn            ) AS gp        FROM   x2       )/*计算结果*/  SELECT cdate ,      CASE WHEN num IS NOT NULL THEN num         ELSE MAX(num / 7) OVER ( PARTITION BY gp )      END AS num  FROM  x3

View Code

  实现的方法不止这一种,也有网友提供了另一种解法。

补充缺失日期及对应数据补充缺失日期及对应数据
WITH  tmp     AS ( SELECT  DATEADD(d, number, '2015-10-03') d ,            number % 7 number        FROM   master..spt_values        WHERE  type = 'P'            AND DATEADD(d, number, '2015-10-03') <= '2015-10-24'       )  SELECT d ,      CASE WHEN tmp1.cdate IS NULL THEN t.num / 7         ELSE tmp1.num      END AS num  FROM  tmp      LEFT JOIN test tmp1 ON tmp.d = tmp1.cdate      OUTER APPLY ( SELECT TOP 1                  *             FROM   test tmp1             WHERE   tmp.d > cdate             ORDER BY cdate DESC            ) t

View Code

  我们还可以再升级一下需求,再计算结果的步骤,不再是除于固定值7,而是除于两个日期

之间相差的天数。感兴趣的朋友可以做下,就当练练手。




原标题:补充缺失日期及对应数据

关键词:日期

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

Etsy极致推广 60%的折扣:https://www.kjdsnews.com/a/1668590.html
黑五来了,单量没爆,比单量先爆的竟是ACOS?:https://www.kjdsnews.com/a/1668591.html
速卖通商家冲刺黑五爆单!菜鸟跨境仓备货量涨了近9倍:https://www.kjdsnews.com/a/1668592.html
亚马逊最新消息,卖家2024年1月1日未上传比利时VAT将被暂停销售:https://www.kjdsnews.com/a/1668593.html
法国EPR又有了新规定!下号时间将缩短?:https://www.kjdsnews.com/a/1668594.html
一文盘点东南亚电商市场主流支付类型:https://www.kjdsnews.com/a/1668595.html
武陵山大裂谷周围景点 武陵山大裂谷周围景点图片:https://www.vstour.cn/a/411233.html
南美旅游报价(探索南美洲的旅行费用):https://www.vstour.cn/a/411234.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流