版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
在实际的业务中,我们会遇到取历史某一天为周几,类似的这样的问题,我这里提供一个方法。具体如下:
场景:取历史一年的数据,按周汇总,并且将每周汇总数据统计到周一对应的日期。(当然这里可以对应到任意周几)
数据存放在表: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
结果如下:
以上就是解决该场景的全部代码,有更好的方法欢迎随时交流。谢谢~