文章目录
- 题目需求
- 思路一
- 实现一
- 题目来源
题目需求
从订单详情表(order_detail)中,求出商品连续售卖的时间区间。
期望结果如下:
sku_id (商品id) | start_date (起始时间) | end_date (结束时间) |
---|---|---|
1 | 2021-09-27 | 2021-09-27 |
1 | 2021-09-30 | 2021-10-01 |
1 | 2021-10-03 | 2021-10-08 |
… | … | … |
需要用到的表:
订单明细表:order_detail
order_detail_id(订单明细id) | order_id(订单id) | sku_id(商品id) | create_date(下单日期) | price(商品单价) | sku_num(商品件数) |
---|---|---|---|---|---|
1 | 1 | 1 | 2021-09-30 | 2000.00 | 2 |
2 | 1 | 3 | 2021-09-30 | 5000.00 | 5 |
22 | 10 | 4 | 2020-10-02 | 6000.00 | 1 |
… | … | … | … | … | … |
思路一
实现一
-- 4) 按 sku_id sub_res 分组排序,将每个 sku_id 的连续的 create_date 存到同一个 array_all
select sku_id,
-- array_all = collect_list(create_date)
collect_list(create_date)[0] as start_date,
collect_list(create_date)[size(collect_list(create_date))-1] as end_date
from (
-- 3) 计算 create_date - row_num 得到 sub_res
-- 2) 计算 row_number(), 按 sku_id 分组、create_date 升序排序
select sku_id,
create_date,
date_add(create_date, -row_number() over (partition by sku_id order by create_date)) as sub_res
from (
-- 1) 按 sku_id create_date 去重
select sku_id,
create_date
from order_detail
group by sku_id, create_date
) t1
) t2
group by sku_id, sub_res;
题目来源
http://practice.atguigu.cn/#/question/29/desc?qType=SQL