SQL面试题练习 —— 查询最近一笔有效订单

2024-06-29 1477阅读

目录

  • 1 题目
  • 2 建表语句
  • 3 题解

    题目来源:字节跳动。

    SQL面试题练习 —— 查询最近一笔有效订单
    (图片来源网络,侵删)

    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 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]