計算前7日間、前30日間のデータ合計

1393 ワード

前言
私たちが開発したとき、このようなニーズがありました.前の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}'