前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode MySQL 1369. 获取最近第二次的活动(over窗口函数)

LeetCode MySQL 1369. 获取最近第二次的活动(over窗口函数)

作者头像
Michael阿明
发布2021-02-19 10:41:20
6250
发布2021-02-19 10:41:20
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

表: UserActivity

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

写一条SQL查询展示每一位用户 最近第二次 的活动(倒数第二次

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

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

下面是查询结果格式的例子:

代码语言:javascript
复制
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  |
+------------+--------------+-------------+-------------+

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/get-the-second-most-recent-activity 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 先选出只有一次活动的人的记录
代码语言:javascript
复制
select *
from UserActivity
group by username
having count(*)=1
代码语言:javascript
复制
{"headers": ["username", "activity", "startDate", "endDate"], 
"values": [["Bob", "Travel", "2020-02-11", "2020-02-18"]]}
  • 窗口函数选出每个人倒数第二次的活动
代码语言:javascript
复制
select username, activity, startDate, endDate
from
(
    select *, rank() over(partition by username order by startDate desc) rnk
    from UserActivity
) t
where rnk = 2
代码语言:javascript
复制
{"headers": ["username", "activity", "startDate", "endDate"], 
"values": [["Alice", "Dancing", "2020-02-21", "2020-02-23"]]}
  • 最后合并
代码语言:javascript
复制
# Write your MySQL query statement below
select *
from
(
    select *
    from UserActivity
    group by username
    having count(*)=1

    union all
    
    select username, activity, startDate, endDate
    from
    (
        select *, rank() over(partition by username order by startDate desc) rnk
        from UserActivity
    ) t
    where rnk = 2
) t

更简洁的写法

代码语言:javascript
复制
# Write your MySQL query statement below
select username, activity, startDate, endDate
from
(
    select *,
        rank() over (partition by username order by startDate desc) rnk,
        count(*) over (partition by username) cnt
    from UserActivity
) t
where cnt = 1 or rnk = 2
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档