首页 > 数据库 >力扣-Mysql-1369-获取最近第二次的活动(困难)

力扣-Mysql-1369-获取最近第二次的活动(困难)

时间:2024-10-28 21:16:45浏览次数:8  
标签:02 username endDate startDate 力扣 2020 Mysql 活动 1369

一、题目来源
 

1369. 获取最近第二次的活动 - 力扣(LeetCode)

二、数据表结构

表: UserActivity

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


三、需求
 

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

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

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

四、示例数据

输入:
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 只有一条记录,我们就取这条记录


五、分析


1.文字分析
 

本题需求为获取最近第二次的活动;

第一步:首先我们根据用户名进行分组,因为是最近的活动,所以按照活动开始时间的降序进行排序获得每个用户参与活动的降序排名,一个人用户不能同时参加超过一项活动,所以不用考虑是否存在排名并列问题,使用row_number()排名函数即可;再统计每个人参与了几次活动

第二步:筛选出排名为2的用户,还有活动次数为1的用户,使用union进行结果连接,得到最终结果。 

2.图解


六、代码实现

with t1 AS (
    SELECT
        username,activity,startDate,endDate,
        count(*) OVER (PARTITION BY username) as cnt,
        row_number() OVER (PARTITION BY username ORDER BY startDate) as rn
    from useractivity
 )
SELECT
    username,activity,startDate,endDate
from t1
where rn = 2
UNION
SELECT
    username,
    activity,startDate,endDate
from t1
where cnt <= 1;



七、总结
 

本次题目的实现使用了CTE表达式,窗口函数等。

窗口函数是mysql8.0之后才有一种函数,窗口函数ROW_NUMBER()是一种分析函数,它为结果集中的每一行分配一个唯一的连续整数,主要使用场景为 排名场景(不存在并列,排名连续)。

标签:02,username,endDate,startDate,力扣,2020,Mysql,活动,1369
From: https://blog.csdn.net/Jotcy/article/details/143313777

相关文章

  • 初识mysql数据库
    1、数据库的概念1.1数据:能被计算机识别并处理的符号集合。1.2数据库:是存储和管理数据的系统。数据库是有组织可共享的,持久存储和管理数据的容器。数据库可以是关系型的,也可以是非关系型的。1.3数据库的优点:1.持久化数据到本地2.可以实现结构化查询,方便管理3.方便数据检......
  • 从零开始的MySQL生活
    1、安装MySQL1.1下载链接通过百度网盘分享的文件:mysql-installer-community-8.0.40.0.msi链接:https://pan.baidu.com/s/1zhZ2qI1OYz4GV4fg9x0E-Q?pwd=gtdk 提取码:gtdk2、配置环境2.1找到刚刚安装的位置,里面有一个名为"bin"的文件夹,打开并复制其路径。2.2配置环......
  • [MySQL]第六章:MySQL表的约束
    本专栏内容为:MySQL学习专栏......
  • mysql弱密码爆破
    mySQL弱密码 靶场:/vulhub/mysql/CVE-2012-2122 启动:docker-composeup-d扫描端口nmap-Sv-Pn-T4靶机ip 看到在3306端口开启了mysql服务爆破账号密码 1.使用超级弱口令检测工具(github下载) 爆破出root/123456 2.使用Hydra爆破hydra-L用户名字典—P密码......
  • MySQL操作
    一.MySQL优点多语言支持:MySQL为C、C++、Python、Java等多种编程语言提供了API,访问和使用方便。可以移植性好:MySQL是跨平台的。支持大量数据查询和存储:MySQL可以承受大量的并发访问。二.MySQL常用命令1.查看当前所有的数据库showdatabases; 2.创建库createdatabase......
  • 【MySql进阶及常见方案】mysql索引底层原理和优化手段
    mysql索引底层原理和优化手段不管业务怎么发展,数据最终都要存储到数据库中,所以数据库是必不可少的一个环节。而随着业务逐渐壮大,并发越来越高,数据库很容易成为整个链路的短板。而调优的第一步,都是从sql语句、索引入手。先得保证单个数据库执行没问题,才会有更高层次的分库......
  • centos中docker安装mysql
    用来记录1先升级yumupdate,遇到问题,解决在上篇centos7yum报错Cannotfindavalidbaseurlforrepo:base/7/x86_642安装docker需要的工具包3配置docker的yum源位置报错,网上查询说是因为国内访问不到docker官方镜像,但是直接在网页里打开连接可以下载,换成阿里云后成......
  • 为什么MySQL单表不能超过2000万行? (1)
    ​最近看到一篇《我说MySQL每张表最好不要超过2000万数据,面试官让我回去等通知》的文章,非常有趣。文中提到,他朋友在面试的过程中说,自己的工作就是把用户操作信息存到MySQL里,因为数据量超大(5000万条左右),需要每天定时生成3张表,然后将数据取模分别存到这三张表里。下面是两人的对......
  • MySQL权限操作
    一、MySQL的权限二、权限用法1.创建用户createuser'admin'@'%'identifiedby'your_password';2.查看用户权限showgrantsfor'admin'@'%';3.授权grantselect,update,insert,deleteondatabase.*to'admin'@'%'......
  • mysql8 gitd 主从复制
    一、master主库1、配置serviceID、开启二进制日志和打开gitd,可以配置中继日志。然后重启mysql。完整配置如下[client]socket=/data/mysql/mysql.sock[mysqld]user=rootdatadir=/data/mysql/databasedir=/data/mysqlsocket=/data/mysql/mysql.sockport=3306#允许最大连......