当前位置: 首页 > news >正文

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

文章目录

查询最近一笔有效订单

一、题目

二、分析

三、SQL实战

四、样例数据参考 


查询最近一笔有效订单

一、题目

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

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

样例数据:

目标结果:

二、分析

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

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

三、SQL实战

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

查询语句:

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_validfrom t5_orderwhere is_valid = 1) t;

查询结果:

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

查询语句:

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_idfrom (select ord_id,ord_time,user_name,is_validfrom t5_orderwhere 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进行分组,按照有效订单表的时间排序,增加分组排序。

查询语句:

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_idfrom (select ord_id,ord_time,user_name,is_validfrom t5_orderwhere 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 的记录。

查询语句:

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_idfrom (select ord_id,ord_time,user_name,is_validfrom t5_orderwhere 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;

查询结果:

四、样例数据参考 

--建表语句
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博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于树莓派4B设计的智能家居控制系统(阿里云IOT)(203)
  • 【Vue】Echarts渲染数据,残留脏数据问题处理
  • k8s笔记之应用创建
  • Apache Tomcat服务器版本号隐藏
  • Qt之Gui
  • springboot二手书资源管理系统-计算机毕业设计源码26338
  • [VBA]使用VBA在Excel中 操作 形状shape 对象
  • 全屏组件封装(react18+antd)
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • 【实现开机自动下载原神(bat脚本)1.0】
  • PythonStudio 控件使用常用方式(十六)TButtonedEdit
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【2.4】导出RKNN模型(第一部分:模型修改)更多内容见视频
  • Midjourney研究笔记丨05图生图:垫图,让机器人为你提供有效关键词
  • LabVIEW中的Reverse String函数与字节序转换
  • MySQL4多表查询 内连接
  • [NodeJS] 关于Buffer
  • 「译」Node.js Streams 基础
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • C++入门教程(10):for 语句
  • CentOS从零开始部署Nodejs项目
  • CSS实用技巧
  • Java的Interrupt与线程中断
  • Java多态
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MySQL的数据类型
  • Netty源码解析1-Buffer
  • oldjun 检测网站的经验
  • React组件设计模式(一)
  • Redux 中间件分析
  • sublime配置文件
  • Webpack 4x 之路 ( 四 )
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 飞驰在Mesos的涡轮引擎上
  • 关于extract.autodesk.io的一些说明
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 算法-图和图算法
  • 新版博客前端前瞻
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 函数计算新功能-----支持C#函数
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $NOIp2018$劝退记
  • (07)Hive——窗口函数详解
  • (a /b)*c的值
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (LeetCode C++)盛最多水的容器
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (二十三)Flask之高频面试点
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)EOS中账户、钱包和密钥的关系
  • (转)大型网站的系统架构
  • .net Application的目录