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

MySQL练手题--获得最近第二次的活动(困难)

一、准备工作

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');

表: UserActivity

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

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

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

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

下面是返回结果格式的例子。

示例 1:

输入:
UserActivity 表:
+------------+--------------+-------------+-------------+
| username   | activity     | startDate   | endDate     |
+------------+--------------+-------------+-------------+
| Alice      | Travel       | 2020-02-12  | 2020-02-20  |
| Alice      | Dancing      | 2020-02-21  | 2020-02-23  |
| Alice      | Travel       | 2020-02-24  | 2020-02-28  |
| Bob        | Travel       | 2020-02-11  | 2020-02-18  |
+------------+--------------+-------------+-------------+
输出:
+------------+--------------+-------------+-------------+
| username   | activity     | startDate   | endDate     |
+------------+--------------+-------------+-------------+
| Alice      | Dancing      | 2020-02-21  | 2020-02-23  |
| Bob        | Travel       | 2020-02-11  | 2020-02-18  |
+------------+--------------+-------------+-------------+
解释:
Alice 最近一次的活动是从 2020-02-24 到 2020-02-28 的旅行, 在此之前的 2020-02-21 到 2020-02-23 她进行了舞蹈
Bob 只有一条记录,我们就取这条记录

二、分析

 

三、实现 

with t as (
    select
        *,
        row_number() over (partition by username order by startDate desc ) rn,
        count(username)over(partition by username) cn
    from useractivity
)
    select
       username,
       activity,
       startDate,
       endDate
    from t
    where rn =2 or cn =1 ;

四、总结

开窗函数对时间排序找出每个用户排名第二的活动,如果只有一次活动开窗对用户分组聚合,选择聚合为1的记录;


http://www.kler.cn/a/312379.html

相关文章:

  • 文件上传漏洞--理论
  • XML Schema 字符串数据类型
  • MarsCode算法题之二叉树供暖问题
  • java---认识异常(详解)
  • 【ARM】MDK-烧录配置文件无权限访问
  • LeetCode:703. 数据流中的第 K 大元素
  • 【JVM】符号引用 和 直接引用
  • 中国计算机学会(CCF)推荐中文科技期刊目录(2019年)
  • nacos报Client not connected, current status:STARTING
  • Stable Diffusion绘画 | ControlNet应用-IP-Adapter:堪比 Midjourney 垫图
  • Ubuntu在CMakeLists.txt中指定OpenCV版本的参考方法
  • 【QT基础】创建项目项目代码解释
  • Python和Java的自动化测试技术研究及应用探索
  • Linux Vim编辑器常用命令
  • 【源码+文档+调试讲解】健身房管理平台小程序
  • 【Linux修行路】网络套接字编程——UDP
  • 828华为云征文 | 云服务器Flexus X实例:one-api 部署,支持众多大模型
  • 信息化时代下的高标准农田灌区:变革与机遇并存
  • 使用Docker Compose一键部署
  • 105.游戏安全项目-基址的技术原理-分析技巧
  • 游戏性能优化
  • 硬件工程师笔试面试学习汇总——器件篇目录
  • 梳理归档文档
  • 鸿蒙开发之ArkUI 界面篇 十四 个人中心导航界面
  • 数据结构 ——— 常见的时间复杂度计算例题(上篇)
  • 使用Spring Boot和Spring WebFlux实现响应式打字效果