SQL,力扣题目1369,获取最近第二次的活动

一、力扣链接

LeetCode_1369

二、题目描述

表: UserActivity

复制代码
+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| username      | varchar |
| activity      | varchar |
| startDate     | Date    |
| endDate       | Date    |
+---------------+---------+
该表可能有重复的行
该表包含每个用户在一段时间内进行的活动的信息
名为 username 的用户在 startDate 到 endDate 日内有一次活动

编写解决方案展示每一位用户 最近第二次 的活动

如果用户仅有一次活动,返回该活动

一个用户不能同时进行超过一项活动,以任意顺序返回结果

三、目标拆解

四、建表语句

sql 复制代码
Create table If Not Exists UserActivity (username varchar(30), activity varchar(30), startDate date, endDate date)
Truncate table UserActivity
insert into UserActivity (username, activity, startDate, endDate) values ('Alice', 'Travel', '2020-02-12', '2020-02-20')
insert into UserActivity (username, activity, startDate, endDate) values ('Alice', 'Dancing', '2020-02-21', '2020-02-23')
insert into UserActivity (username, activity, startDate, endDate) values ('Alice', 'Travel', '2020-02-24', '2020-02-28')
insert into UserActivity (username, activity, startDate, endDate) values ('Bob', 'Travel', '2020-02-11', '2020-02-18')

五、过程分析

1、按用户分组,起始日期倒序排名

2、进行左连接

3、取最近第二次的活动,没有就取第一天的活动

六、代码实现

sql 复制代码
with t1 as(
select username, activity, startDate, endDate,
       row_number() over(partition by username order by startDate desc) rn
from UserActivity
)
select a.username, ifnull(b.activity, a.activity) activity, ifnull(b.startDate, a.startDate) startDate, ifnull(b.endDate, a.endDate) endDate
from(
select * from t1 where rn = 1) a
left join(
select * from t1 where rn = 2) b 
on b.username = a.username;

七、结果验证

八、小结

1、CTE表达式 + 排名函数 + left join

2、思路:以第一次的活动为基础来取第二次的,不存在第二次的活动就取第一次的

相关推荐
(Charon)31 分钟前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
hansang_IR43 分钟前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶1 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康1 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_0021 小时前
C++11(一)
开发语言·c++·算法
529宝宝起名网1 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
ocean21032 小时前
2025-2026年AI提效与实践大厂面试高频问题
人工智能·面试·职场和发展·提示词工程·ai提效
带多刺的玫瑰3 小时前
Leecode#26刷题之删除有序数组中的重复项
数据结构·算法·leetcode
en.en..3 小时前
C语言核心解析:#define与typedef本质区别
开发语言·c++·算法
YonyouHRSaaS5 小时前
AI视频面试系统定义、功能作用、品牌推荐、选择攻略
人工智能·面试·职场和发展·ai面试·视频面试·ai视频面试