hive中日期问题—取具体某一天为周几的方法及其应用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_37536446/article/details/87795012

在实际的业务中,我们会遇到取历史某一天为周几,类似的这样的问题,我这里提供一个方法。具体如下:

场景:取历史一年的数据,按周汇总,并且将每周汇总数据统计到周一对应的日期。(当然这里可以对应到任意周几)

数据存放在表:dw_db.tmp_data_info_week,数据格式如下:

下面提供具体的解决方法:

思路:1、求出上述日期对应周几,找出每一天所在周的周一和周日。

           2、按照周一和周日进行汇总。

所用函数:pmod:正取余函数。pmod(int a, int b):返回正的a除以b的余数

                  datediff:计算两个日期之间相差的天数

注:

pmod(datediff(etd,'1920-01-01')-3,7)='0'  表示某天对应的周几,数值为0~6

IF(pmod(datediff(etd,'1920-01-01')-3,7)='0',7,pmod(datediff(etd,'1920-01-01')-3,7))表示:如果pmod(datediff(etd,'1920-01-01')-3,7)='0',则返回7,否则返回pmod(datediff(etd,'1920-01-01')-3,7),其目的是为了将周0转化成周7

详细代码如下:(这里方便书写,分了两步)

第一步:

--第一步:计算出每天对应的周几,以及该天所在周的周一和周日
USE dw_db;
DROP TABLE IF EXISTS dw_db.tmp_data_info_01; 
CREATE TABLE dw_db.tmp_data_info_01 AS
SELECT a.*
      ,CASE WHEN zhou=1 THEN date_add(etd,6)
            WHEN zhou=2 THEN date_add(etd,5)
            WHEN zhou=3 THEN date_add(etd,4)
            WHEN zhou=4 THEN date_add(etd,3)
            WHEN zhou=5 THEN date_add(etd,2)
            WHEN zhou=6 THEN date_add(etd,1) ELSE date_add(etd,0) END AS zhouri   --每周对应的周一
      ,CASE WHEN zhou=1 THEN date_sub(etd,0)
            WHEN zhou=2 THEN date_sub(etd,1)
            WHEN zhou=3 THEN date_sub(etd,2)
            WHEN zhou=4 THEN date_sub(etd,3)
            WHEN zhou=5 THEN date_sub(etd,4)
            WHEN zhou=6 THEN date_sub(etd,5) ELSE date_sub(etd,6) END AS zhouyi   --每周对应的周日
 FROM 
  (   SELECT etd
            ,shagnhu
            ,IF(pmod(datediff(etd,'1920-01-01')-3,7)='0',7,pmod(datediff(etd,'1920-01-01')-3,7)) as zhou  --得到周几
            ,quantity
        FROM dw_db.tmp_data_info_week t 
   ) a
; 

结果如下:

第二步:

--第二步:按照周一和周日汇总
SELECT effectdate
      ,shagnhu
      ,quantity
  FROM 
  (   SELECT shagnhu
            ,zhouyi        AS effectdate   --周一
            ,zhouri        AS enddate      --周日
            ,sum(quantity) AS quantity     --每周数据加总
        FROM dw_db.tmp_data_info_01
       GROUP BY shagnhu,zhouyi,zhouri 
   ) a 
 GROUP BY effectdate,shagnhu,quantity

结果如下:

以上就是解决该场景的全部代码,有更好的方法欢迎随时交流。谢谢~

猜你喜欢

转载自blog.csdn.net/weixin_37536446/article/details/87795012