07 | 查询最近一笔有效订单


目录

一、问题定义与业务场景

二、数据准备与建表语句

2.1 建表语句

2.2 样例数据

2.3 期望结果

三、问题分析

四、SQL解决方案


一、问题定义与业务场景

目标:为每个用户查询最近一笔有效订单(非取消状态且最近完成)。
核心需求:

  1. 排除 is_valid = 0(取消状态)的订单
  2. 返回每个用户最近一笔成功订单的详细信息
  3. 无有效订单时返回 NULL

业务场景:电商订单追溯、风控系统交易校验、用户行为分析。


二、数据准备与建表语句

2.1 建表语句

CREATE TABLE t_order (
    order_id BIGINT PRIMARY KEY COMMENT '订单ID',
    order_time DATETIME NOT NULL COMMENT '下单时间',
    user_id VARCHAR(20) NOT NULL COMMENT '用户ID',
    is_valid TINYINT DEFAULT 1 COMMENT '是否有效(1有效,0取消)'
);

2.2 样例数据

INSERT INTO t_order (order_id, order_time, user_id, is_valid) VALUES
(1, '2025-06-01 09:00:00', 'U1001', 1),
(2, '2025-06-01 09:05:00', 'U1001', 0), 
(3, '2025-06-01 09:10:00', 'U1001', 0),  
(4, '2025-06-01 10:00:00', 'U1001', 1),
(5, '2025-06-01 10:30:00', 'U1001', 1),
(6, '2025-06-01 10:45:00', 'U1002', 1),
(7, '2025-06-01 11:00:00', 'U1002', 0),
(8, '2025-06-01 11:05:00', 'U1002', 1),
(9, '2025-06-01 11:10:00', 'U1002', 1);

2.3 期望结果


三、问题分析

本题是查询上一条记录问题的升级版本,核心难点在于:无法预知相邻订单的有效性状态,这种不确定性增加了题目的难度。

四、SQL解决方案

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

SELECT
	order_id,
	order_time,
	user_id,
	is_valid,
	lag( order_id ) over ( PARTITION BY user_id ORDER BY order_time ASC ) AS last_valid_order_id 
FROM
	( SELECT order_id, order_time, user_id, is_valid FROM t_order WHERE is_valid = 1 ) tmp

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

WITH tmp AS(
  SELECT
	order_id,
	order_time,
	user_id,
	is_valid,
	lag(order_id) over (PARTITION BY user_id ORDER BY order_time ASC) AS last_valid_order_id 
FROM
(  
	SELECT
		order_id,
		order_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.order_time <= t2.order_time

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

WITH tmp AS (
	SELECT
		order_id,
		order_time,
		user_id,
		is_valid,
		lag( order_id ) over ( PARTITION BY user_id ORDER BY order_time ASC ) AS last_valid_order_id 
	FROM
		( SELECT order_id, order_time, user_id, is_valid FROM t_order WHERE is_valid = 1 ) t 
	) 
SELECT
	t1.*,
	t2.*,
	ROW_NUMBER() OVER ( PARTITION BY t1.order_id, t1.user_id ORDER BY t2.order_time ASC ) AS rn 
FROM
	t_order t1
	LEFT JOIN tmp t2 ON t1.user_id = t2.user_id 
WHERE
	t1.order_time <= t2.order_time

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

WITH tmp AS (
	SELECT
		order_id,
		order_time,
		user_id,
		is_valid,
		lag( order_id ) over ( PARTITION BY user_id ORDER BY order_time ASC ) AS last_valid_order_id 
	FROM
		( SELECT order_id, order_time, user_id, is_valid FROM t_order WHERE is_valid = 1 ) t 
	) 
SELECT
	* 
FROM
	(
	SELECT
		t1.*,
		t2.last_valid_order_id,
		ROW_NUMBER() OVER ( PARTITION BY t1.order_id, t1.user_id ORDER BY t2.order_time ASC ) AS rn 
	FROM
		t_order t1
		LEFT JOIN tmp t2 ON t1.user_id = t2.user_id 
	WHERE
		t1.order_time <= t2.order_time 
	) t3 
WHERE
	rn = 1;

大数据面试SQL(五):查询最近一笔有效订单 3、使用row_number,原始订单记录表中的user_name、ord_id进行分组,按照有效订单表的时间排序,增加分组排序。2、原始的明细数据与新的有效订单表按照用户进行关联,有效订单表的订单时间大于等于原始订单表。现有订单表t5_order,包含订单ID,订单时间,下单用户,当前订单是否有效。请查询出每笔订单的上一笔有效订单,注意不是每笔订单都是有效的。1、先查询出有效订单,然后计算出每笔有效订单的上一单有效订单。我们可以看出,最终我们需要的就是rn=1 的记录。 阅读详情

相关推荐

SQL进阶技巧:计算每个uid上一笔成功订单id | 近距离有效匹配问题【last_value ignore nulls实现版】

求:每个uid上一笔成功订单id,没有的记录为null,状态值:1-成功 0-失败id time uid is_suc 结果列。

石榴姐yyds 357

Hierarchical Flow Partition(Top-down&&Bottom-up)

hierarchy flow是将设计切分成多个block,分别处理单个block,然后完成后,将它们进行拼接以完成最终的chip。一般划分为三个阶段:chip planning;physical budget就是pin assignmenthierarchy flow实现的方法有两种,一种是top-down,另一种是bottom-up,无论是哪种,都是都要通过flatten的方法分别全局范围进行优化实现。

qq_39493558的博客 3070

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 195

微软Media Creation Tool 创建工具 1.3 升级:支持全新下载安装Win11 22H2 Build 22621.525

微软 Media Creation Tool 创建工具 1.3 升级:支持全新下载安装 Win11 22H2 Build 22621.525 ISO 镜像,如果今天运行使用 Media Creation Tool,则会下载 Windows 11 2022 版本 Build 22621.525,它不会向操作系统添加任何新内容,但会修复安装问题,下面来看看详细的更新内容。

zym0218的博客 4231

应急响应之windows日志分析工具logparser使用

windows日志分析工具logparser使用介绍

u013930899的博客 8123

如何做好软件需求分析?

软件需求分析也称为系统需求分析或需求分析工程等,是开发人员经过深入细致的调研和分析,准确理解用户和项目的功能、性能、可靠性等具体要求,将用户非形式的需求表述转化为完整的需求定义,从而确定系统必须做什么的过程。软件开发一般包括:可行性分析、需求分析、软件设计、软件开发、软件测试、软件实施、软件服务等步骤,需求分时软件开发的第一步骤。用户需求分析是指在系统设计之前和设计、开发过程中对用户需求所作的调查与分析,是系统设计、系统完善和系统维护的依据。

qq_41854911的博客 1415

脑肿瘤MRI图像分割实战:基于U-Net的深度学习完整指南

脑肿瘤是中枢神经系统最常见的疾病之一,全球每年有超过30万人被诊断为原发性脑肿瘤。在临床诊断和治疗过程中,磁共振成像(MRI)已成为评估脑肿瘤的标准影像学检查方法。然而,手动分割MRI图像中的肿瘤区域是一项耗时且依赖于专家经验的工作,不同医生之间可能存在显著差异。

YOLO 151

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)和实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)和Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2019

39、FIPA ACL:多代理系统中的标准化通信

本文详细介绍了FIPA ACL(Agent Communication Language)的基本概念、言语行为理论基础以及其在多代理系统(MAS)中的应用。文章涵盖了FIPA ACL的消息格式、信息交流流程、实现与优化方法,并通过智能调度系统的实例展示了其实际应用效果。此外,还探讨了FIPA ACL面临的挑战及未来发展方向,如通信延迟优化、本体简化、安全性增强等。

k8s6orchestrator的博客 381

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 06 | 使用共同IP地址问题
下一篇: 数据分析常用指标名词解释及计算公式
走过冬季
博客等级 码龄9年 1609粉丝 341原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值