大数据面试SQL(五):查询最近一笔有效订单

文章目录

查询最近一笔有效订单

一、题目

二、分析

三、SQL实战

四、样例数据参考


查询最近一笔有效订单

一、题目

现有订单表t5_order,包含订单ID,订单时间,下单用户,当前订单是否有效。

请查询出每笔订单的上一笔有效订单,注意不是每笔订单都是有效的。

样例数据:

目标结果:

二、分析

本题是查询上一条记录的升级版本,所以考察的lag()函数,但是我们也不知道上一单是有效还是无效,所以这个题目难度就增加了很多。

维度 评分
题目难度 ⭐️⭐️⭐️⭐️⭐️
题目清晰度 ⭐️⭐️⭐️⭐️
业务常见度 ⭐️⭐️⭐️⭐️

三、SQL实战

1、先查询出有效订单,然后计算出每笔有效订单的上一单有效订单。

查询语句:

sql 复制代码
select ord_id,
       ord_time,
       user_name,
       is_valid,
       lag(ord_id) over (partition by user_name order by ord_time asc) as last_valid_ord_id
from (select ord_id,
             ord_time,
             user_name,
             is_valid
      from t5_order
      where is_valid = 1) t;

查询结果:

2、原始的明细数据与新的有效订单表按照用户进行关联,有效订单表的订单时间大于等于原始订单表。

查询语句:

sql 复制代码
with tmp as (
    -- 有效订单及其上一单有效记录
    select ord_id,
           ord_time,
           user_name,
           is_valid,
           lag(ord_id) over (partition by user_name order by ord_time asc) as last_valid_ord_id
    from (select ord_id,
                 ord_time,
                 user_name,
                 is_valid
          from t5_order
          where is_valid = 1) t)
select t1.*,
       t2.*
from t5_order t1
left join tmp t2 on t1.user_name = t2.user_name
where t1.ord_time <= t2.ord_time;

查询结果:

3、使用row_number,原始订单记录表中的user_name、ord_id进行分组,按照有效订单表的时间排序,增加分组排序。

查询语句:

sql 复制代码
with tmp as (
    -- 有效订单及其上一单有效记录
    select ord_id,
           ord_time,
           user_name,
           is_valid,
           lag(ord_id) over (partition by user_name order by ord_time asc) as last_valid_ord_id
    from (select ord_id,
                 ord_time,
                 user_name,
                 is_valid
          from t5_order
          where is_valid = 1) t)
select t1.*,
       t2.*,
       row_number() over (partition by t1.ord_id,t1.user_name order by t2.ord_time asc) as rn
from t5_order t1
left join tmp t2 on t1.user_name = t2.user_name
where t1.ord_time <= t2.ord_time;

我们可以看出,最终我们需要的就是rn=1 的记录。

查询结果:

4、去除冗余字段,筛选rn=1 的记录。

查询语句:

sql 复制代码
with tmp as (
    -- 有效订单及其上一单有效记录
    select ord_id,
           ord_time,
           user_name,
           is_valid,
           lag(ord_id) over (partition by user_name order by ord_time asc) as last_valid_ord_id
    from (select ord_id,
                 ord_time,
                 user_name,
                 is_valid
          from t5_order
          where is_valid = 1) t
)
select * from
(select t1.*,
       t2.*,
       row_number() over (partition by t1.ord_id,t1.user_name order by t2.ord_time asc) as rn
from t5_order t1
left join tmp t2 on t1.user_name = t2.user_name
where t1.ord_time <= t2.ord_time) tt
where tt.rn = 1;

查询结果:

四、样例数据参考

sql 复制代码
--建表语句
create table t5_order
(
    ord_id bigint COMMENT '订单ID',
    ord_time string COMMENT '订单时间',
    user_name string COMMENT '用户名',
    is_valid int COMMENT '订单是否有效'
);
-- 数据插入
insert into t5_order(ord_id,ord_time,user_name,is_valid)
values
    (1,'2024-08-11 12:01:03','姬小满',1),
    (2,'2024-08-11 12:02:06','姬小满',0),
    (3,'2024-08-11 12:03:15','姬小满',0),
    (4,'2024-08-11 12:04:20','姬小满',1),
    (5,'2024-08-11 12:05:03','姬小满',1),
    (6,'2024-08-11 12:01:02','甄姬',1),
    (7,'2024-08-11 12:03:03','甄姬',0),
    (8,'2024-08-11 12:04:01','甄姬',1),
    (9,'2024-08-11 12:07:03','甄姬',1);

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨
相关推荐
易营宝14 小时前
多语言网站建设避坑指南:既要“数据同步”,又能“按市场个性化”,别踩这 5 个坑
大数据·人工智能
fanstuck14 小时前
从0到提交,如何用 ChatGPT 全流程参与建模比赛的
大数据·数学建模·语言模型·chatgpt·数据挖掘
春日见14 小时前
vscode代码无法跳转
大数据·人工智能·深度学习·elasticsearch·搜索引擎
萤丰信息15 小时前
AI 筑基・生态共荣:智慧园区的价值重构与未来新途
大数据·运维·人工智能·科技·智慧城市·智慧园区
此刻你18 小时前
常用的 SQL 语句
数据库·sql·oracle
冰糖猕猴桃18 小时前
【AI】把“大杂烩抽取”拆成多步推理:一个从单提示到多阶段管线的实践案例
大数据·人工智能·ai·提示词·多步推理
马猴烧酒.19 小时前
【面试八股|Java集合】Java集合常考面试题详解
java·开发语言·python·面试·八股
才盛智能科技19 小时前
K链通×才盛云:自助KTV品牌从0到1孵化超简单
大数据·人工智能·物联网·自助ktv系统·才盛云
广州赛远19 小时前
IRB2600-201.65特殊机器人防护服清洗工具详解与避坑指南
大数据·人工智能
川西胖墩墩19 小时前
垂直模型价值:专业领域超越通用模型的竞争
大数据·人工智能