前言
我们开发时候有这样的需求。需要计算前7天,前30天营收总和。以及昨天数据,周数据环比增长等
实现
如果使用 left join来做会非常麻烦,甚至出错。比如1天的数据left join 7天前的数据之后输出的是7天数据再left join 14天数据则变成 7 * 14的输出。数据会膨胀非常多
这里提供一条思路:使用开窗函数 over(order by rows between xx and xx)来解决
SELECT theday
userid
,gaap_day
,yunyan_secd_prd_name
,productid
,sum(gaap_day) OVER (PARTITION BY userid, yunyan_secd_prd_name, productid ORDER BY theday ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) AS gaap_1day_sum
,sum(gaap_day) OVER (PARTITION BY userid, yunyan_secd_prd_name, productid ORDER BY theday ROWS BETWEEN 7 PRECEDING AND CURRENT ROW ) AS gaap_7day_sum
,sum(gaap_day) OVER (PARTITION BY userid, yunyan_secd_prd_name, productid ORDER BY theday ROWS BETWEEN 14 PRECEDING AND CURRENT ROW ) AS gaap_14day_sum
,sum(gaap_day) OVER (PARTITION BY userid, yunyan_secd_prd_name, productid ORDER BY theday ROWS BETWEEN 30 PRECEDING AND CURRENT ROW ) AS gaap_30day_sum
FROM demo_bi.crm_gaap_day_cid_uid
WHERE theday >= to_char(dateadd(to_date('${bizdate}', 'yyyymmdd'), - 30, 'dd'), 'yyyymmdd')
AND theday <= '${bizdate}'
网友评论