【HQL】HQL實現每日訂單量和未填地址訂單量以及未填地址訂單量N日後的變化

原始表(order_tbl),按dt分區,每天分區保存全量訂單

(20200321分區)

order_id

address

trade_time

dt

1

天津

20200320

20200321

2

北京

20200320

20200321

3

北京

20200319

20200321

4

天津

20200319

20200321

5

北京

20200321

20200321

6


20200321

20200321


(20200320分區)

order_id

address

trade_time

dt

1


20200320

20200320

2

北京

20200320

20200320

3

北京

20200319

20200320

4


20200319

20200320


使用SQL實現,每日訂單量,當日未填地址訂單數,1日後未填地址數量,2日後未填地址數量3日後未填地址數量



解釋: 1日後未填地址數量】,指某日的訂單中,下一天未填地址訂單的量

例如:trade_time=20200320,未填地址訂單1個,【1日後未填地址數量】要統計分區dt=20200321trade_time=20200320在的未填地址訂單0



結果表


trade_time

order_cnt

no_address_cnt

1_day_later

2_day_later

3_day_later

4_day_later

5_day_later

20200323

300

50

0

0

0

0

0

20200322

400

80

50

0

0

0

0

20200321

333

55

41

32

0

0

0

……








20200312










with order_tbl as 
(
-- 20200320分區
select 1  as order_id, '天津' as address, 20200319 as trade_time, 20200320 as dt union all 
select 2  as order_id, null  as address, 20200319 as trade_time, 20200320 as dt union all 
select 3  as order_id, '北京' as address, 20200320 as trade_time, 20200320 as dt union all 
select 4  as order_id, '北京' as address, 20200320 as trade_time, 20200320 as dt union all 
select 5  as order_id, null  as address, 20200320 as trade_time, 20200320 as dt union all 
select 6  as order_id, null  as address, 20200320 as trade_time, 20200320 as dt union all 
select 7  as order_id, null  as address, 20200320 as trade_time, 20200320 as dt union all
-- 20200321分區
select 1  as order_id, '天津' as address, 20200319 as trade_time, 20200321 as dt union all 
select 2  as order_id, '天津'  as address, 20200319 as trade_time, 20200321 as dt union all 
select 3  as order_id, '北京' as address, 20200320 as trade_time, 20200321 as dt union all 
select 4  as order_id, '北京' as address, 20200320 as trade_time, 20200321 as dt union all 
select 5  as order_id, '北京'  as address, 20200320 as trade_time, 20200321 as dt union all 
select 6  as order_id, null  as address, 20200320 as trade_time, 20200321 as dt union all 
select 7  as order_id, null  as address, 20200320 as trade_time, 20200321 as dt union all
select 8  as order_id, '北京' as address, 20200321 as trade_time, 20200321 as dt union all 
select 9  as order_id, null  as address, 20200321 as trade_time, 20200321 as dt union all 
select 10 as order_id, null  as address, 20200321 as trade_time, 20200321 as dt union all 
-- 20200322分區
select 1  as order_id, '天津' as address, 20200319 as trade_time, 20200322 as dt union all 
select 2  as order_id, '天津'  as address, 20200319 as trade_time, 20200322 as dt union all 
select 3  as order_id, '北京' as address, 20200320 as trade_time, 20200322 as dt union all 
select 4  as order_id, '北京' as address, 20200320 as trade_time, 20200322 as dt union all 
select 5  as order_id, '北京'  as address, 20200320 as trade_time, 20200322 as dt union all 
select 6  as order_id, '北京'  as address, 20200320 as trade_time, 20200322 as dt union all 
select 7  as order_id, null  as address, 20200320 as trade_time, 20200322 as dt union all
select 8  as order_id, '北京'  as address, 20200321 as trade_time, 20200322 as dt union all 
select 9  as order_id, null  as address, 20200321 as trade_time, 20200322 as dt union all 
select 10 as order_id, null  as address, 20200321 as trade_time, 20200322 as dt union all 
select 11 as order_id, '北京'  as address, 20200322 as trade_time, 20200322 as dt union all 
select 12 as order_id, null   as address, 20200322 as trade_time, 20200322 as dt union all 
select 13 as order_id, null   as address, 20200322 as trade_time, 20200322 as dt 
)
select trade_time, order_cnt, 1_day_later, 2_day_later, 3_day_later from 
(
    select 
        trade_time, 
        order_cnt, 
        no_address_cnt,
        LEAD(no_address_cnt, 1, 0 ) over (partition by trade_time order by dt asc) as 1_day_later,
        LEAD(no_address_cnt, 2, 0 ) over (partition by trade_time order by dt asc) as 2_day_later,
        LEAD(no_address_cnt, 3, 0 ) over (partition by trade_time order by dt asc) as 3_day_later,
        row_number () over(partition by trade_time ORDER BY dt) as rn
    from 
    (
        select dt, trade_time, count(1) as order_cnt, sum(case when address is null then 1 else 0 end) as no_address_cnt from order_tbl group by dt, trade_time
    ) a
) b
where rn = 1
order by trade_time desc


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章