SQL面试题练习 —— 查询最近一笔有效订单
目录
- 1 题目
- 2 建表语句
- 3 题解
题目来源:字节跳动。
(图片来源网络,侵删)1 题目
现有订单表t_order,包含订单ID,订单时间,下单用户,当前订单是否有效,请查询出每个用户每笔订单的上一笔有效订单
+---------+----------------------+----------+-----------+ | ord_id | ord_time | user_id | is_valid | +---------+----------------------+----------+-----------+ | 1 | 2023-12-11 12:01:03 | a | 1 | | 2 | 2023-12-11 12:02:06 | a | 0 | | 3 | 2023-12-11 12:03:15 | a | 0 | | 4 | 2023-12-11 12:04:20 | a | 1 | | 5 | 2023-12-11 12:05:03 | a | 1 | | 6 | 2023-12-11 12:01:02 | b | 1 | | 7 | 2023-12-11 12:03:03 | b | 0 | | 8 | 2023-12-11 12:04:01 | b | 1 | | 9 | 2023-12-11 12:07:03 | b | 1 | +---------+----------------------+----------+-----------+
期望查询结果如下:
+---------+----------------------+----------+-----------+--------------------+ | ord_id | ord_time | user_id | is_valid | last_valid_ord_id | +---------+----------------------+----------+-----------+--------------------+ | 1 | 2023-12-11 12:01:03 | a | 1 | NULL | | 2 | 2023-12-11 12:02:06 | a | 0 | 1 | | 3 | 2023-12-11 12:03:15 | a | 0 | 1 | | 4 | 2023-12-11 12:04:20 | a | 1 | 1 | | 5 | 2023-12-11 12:05:03 | a | 1 | 4 | | 6 | 2023-12-11 12:01:02 | b | 1 | NULL | | 7 | 2023-12-11 12:03:03 | b | 0 | 6 | | 8 | 2023-12-11 12:04:01 | b | 1 | 6 | | 9 | 2023-12-11 12:07:03 | b | 1 | 8 | +---------+----------------------+----------+-----------+--------------------+
2 建表语句
--建表语句 create table t_order ( ord_id bigint COMMENT '订单ID', ord_time string COMMENT '订单时间', user_id string COMMENT '用户', is_valid bigint COMMENT '订单是否有效' ) COMMENT '订单记录表' stored as orc ; -- 数据插入 insert into t_order(ord_id,ord_time,user_id,is_valid) values (1,'2023-12-11 12:01:03','a',1), (2,'2023-12-11 12:02:06','a',0), (3,'2023-12-11 12:03:15','a',0), (4,'2023-12-11 12:04:20','a',1), (5,'2023-12-11 12:05:03','a',1), (6,'2023-12-11 12:01:02','b',1), (7,'2023-12-11 12:03:03','b',0), (8,'2023-12-11 12:04:01','b',1), (9,'2023-12-11 12:07:03','b',1);
3 题解
(1)先查询出有效订单,然后计算出每笔有效订单的上一单有效订单;
select ord_id, ord_time, user_id, is_valid, lag(ord_id) over (partition by user_id order by ord_time asc) as last_valid_ord_id from (select ord_id, ord_time, user_id, is_valid from t_order where is_valid = 1) t执行结果
+---------+----------------------+----------+-----------+--------------------+ | ord_id | ord_time | user_id | is_valid | last_valid_ord_id | +---------+----------------------+----------+-----------+--------------------+ | 1 | 2023-12-11 12:01:03 | a | 1 | NULL | | 4 | 2023-12-11 12:04:20 | a | 1 | 1 | | 5 | 2023-12-11 12:05:03 | a | 1 | 4 | | 6 | 2023-12-11 12:01:02 | b | 1 | NULL | | 8 | 2023-12-11 12:04:01 | b | 1 | 6 | | 9 | 2023-12-11 12:07:03 | b | 1 | 8 | +---------+----------------------+----------+-----------+--------------------+
(2)原始的明细数据与新的有效订单表按照用户进行关联,有效订单表的订单时间大于等于原始订单表;
with tmp as ( -- 有效订单及其上一单有效记录 select ord_id, ord_time, user_id, is_valid, lag(ord_id) over (partition by user_id order by ord_time asc) as last_valid_ord_id from (select ord_id, ord_time, user_id, is_valid from t_order where is_valid = 1) t) select t1.*, t2.* from t_order t1 left join tmp t2 on t1.user_id = t2.user_id where t1.ord_time
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
