The original table (order? TBL) is partitioned by dt, and the full order is saved by partition every day
(zone 20200321)
order_id |
address |
trade_time |
dt |
1 |
Tianjin |
20200320 |
20200321 |
2 |
Beijing |
20200320 |
20200321 |
3 |
Beijing |
20200319 |
20200321 |
4 |
Tianjin |
20200319 |
20200321 |
5 |
Beijing |
20200321 |
20200321 |
6 |
20200321 |
20200321 |
(zone 20200320)
order_id |
address |
trade_time |
dt |
1 |
20200320 |
20200320 |
|
2 |
Beijing |
20200320 |
20200320 |
3 |
Beijing |
20200319 |
20200320 |
4 |
20200319 |
20200320 |
Use SQL to implement, daily order quantity, number of orders without address on the day, number of orders without address after 1 day, number of orders without address after 2 days, number of orders without address after 3 days
Explanation: [quantity without address after 1 day] refers to the quantity of order without address on the next day in the order of a certain day
For example: trade time = 20200320, 1 order without address, 0 order without address under trade time = 20200320 under dt=20200321 in the [number of orders without address after 1 day] area
Result table
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 partition select 1 as order_id, 'Tianjin' 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, 'Beijing' as address, 20200320 as trade_time, 20200320 as dt union all select 4 as order_id, 'Beijing' 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 partition select 1 as order_id, 'Tianjin' as address, 20200319 as trade_time, 20200321 as dt union all select 2 as order_id, 'Tianjin' as address, 20200319 as trade_time, 20200321 as dt union all select 3 as order_id, 'Beijing' as address, 20200320 as trade_time, 20200321 as dt union all select 4 as order_id, 'Beijing' as address, 20200320 as trade_time, 20200321 as dt union all select 5 as order_id, 'Beijing' 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, 'Beijing' 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 partition select 1 as order_id, 'Tianjin' as address, 20200319 as trade_time, 20200322 as dt union all select 2 as order_id, 'Tianjin' as address, 20200319 as trade_time, 20200322 as dt union all select 3 as order_id, 'Beijing' as address, 20200320 as trade_time, 20200322 as dt union all select 4 as order_id, 'Beijing' as address, 20200320 as trade_time, 20200322 as dt union all select 5 as order_id, 'Beijing' as address, 20200320 as trade_time, 20200322 as dt union all select 6 as order_id, 'Beijing' 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, 'Beijing' 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, 'Beijing' 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