【LeetCode数据库512】游戏玩法分析 II(窗口函数)
  EIlYVvTMMLN7 2023年11月02日 56 0


一、题目

【LeetCode数据库512】游戏玩法分析 II(窗口函数)_mysql


【LeetCode数据库512】游戏玩法分析 II(窗口函数)_mysql_02

二、思路

【LeetCode数据库512】游戏玩法分析 II(窗口函数)_时间复杂度_03


mysql 8.0有窗口函数可以使用,排序问题一般有3种情况(以3、7、7、9为栗子):

  • ​ROW_NUMBER()​​函数:按顺序求行数,结果为1,2,3,4
  • ​RANK()​​函数:有间隔的分级,结果为1,2,2,4
  • ​DENSE_RANK()​​函数:无间隔的分级,结果为1,2,2,3

窗口函数最关键的是搞明白关键字 ​​PARTITON BY​​​ 和 ​​ORDER BY​​ 的作用。

  • ​PARTITON BY​​​ 是用来分组,即选择要看哪个窗口,类似于​​GROUP BY​​​ 子句的分组功能,但是​​PARTITION BY​​​ 子句并不具备​​GROUP BY​​ 子句的汇总功能,并不会改变原始表中记录的行数。
  • ​ORDER BY​​ 是用来排序,即决定窗口内,是按那种规则(字段)来排序的。

如下的栗子,根据​​product_type​​​产品类别进行分类,并且在每类产品中进行排序​​RANK​​的排序(有间隔的分级排序):

SELECT product_name
,product_type
,sale_price
,RANK() OVER (PARTITION BY product_type
ORDER BY sale_price) AS ranking
FROM product;

+--------------+--------------+------------+---------+
| product_name | product_type | sale_price | ranking |
+--------------+--------------+------------+---------+
| 圆珠笔 | 办公用品 | 100 | 1 |
| 打孔器 | 办公用品 | 500 | 2 |
| 叉子 | 厨房用具 | 500 | 1 |
| 擦菜板 | 厨房用具 | 880 | 2 |
| 菜刀 | 厨房用具 | 3000 | 3 |
| 高压锅 | 厨房用具 | 6800 | 4 |
| T恤 | 衣服 | 1000 | 1 |
| 运动T恤 | 衣服 | 4000 | 2 |
+--------------+--------------+------------+---------+
8 rows in set (0.00 sec)

回到这题,目标是找到每位玩家第一次登陆的设备。
窗口函数可以很方便实现:对【玩家id】进行分组,每组进行求​​​ROW_NUMBER​​​(按顺序求行数),我们即可得到像上面的分组且组内排序好的结果,然后定位到每组内的第一个元素即可,即​​where ranknum = 1​​,不过从结果上看这种做法的时间复杂度稍高,空间复杂度倒好。

三、代码

# Write your MySQL query statement below
SELECT player_id,
device_id
FROM(
SELECT player_id,
device_id,
ROW_NUMBER() OVER (PARTITION BY player_id
ORDER BY event_date) AS ranknum
FROM Activity)as a
WHERE ranknum = 1;

【LeetCode数据库512】游戏玩法分析 II(窗口函数)_mysql_04


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  bzUvzvVq9oY1   2023年11月02日   28   0   0 数据类型json数据库
  20xfzlOvosRH   2023年12月05日   13   0   0 mysql数据库
EIlYVvTMMLN7
最新推荐 更多