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

【力扣 | SQL题 | 每日3题】力扣1107,1112, 1077

今天三道mid题都可以用窗口函数轻松秒杀。

1. 力扣1107:每日新用户统计

1.1 题目:

Traffic 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| activity      | enum    |
| activity_date | date    |
+---------------+---------+
该表可能有重复的行。
activity 列是 ENUM 类型,可能取 ('login', 'logout', 'jobs', 'groups', 'homepage') 几个值之一。

编写解决方案,找出从今天起最多 90 天内,每个日期该日期首次登录的用户数。假设今天是 2019-06-30 

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:
Traffic 表:
+---------+----------+---------------+
| user_id | activity | activity_date |
+---------+----------+---------------+
| 1       | login    | 2019-05-01    |
| 1       | homepage | 2019-05-01    |
| 1       | logout   | 2019-05-01    |
| 2       | login    | 2019-06-21    |
| 2       | logout   | 2019-06-21    |
| 3       | login    | 2019-01-01    |
| 3       | jobs     | 2019-01-01    |
| 3       | logout   | 2019-01-01    |
| 4       | login    | 2019-06-21    |
| 4       | groups   | 2019-06-21    |
| 4       | logout   | 2019-06-21    |
| 5       | login    | 2019-03-01    |
| 5       | logout   | 2019-03-01    |
| 5       | login    | 2019-06-21    |
| 5       | logout   | 2019-06-21    |
+---------+----------+---------------+
输出:
+------------+-------------+
| login_date | user_count  |
+------------+-------------+
| 2019-05-01 | 1           |
| 2019-06-21 | 2           |
+------------+-------------+
解释:
请注意,我们只关心用户数非零的日期.
ID 为 5 的用户第一次登陆于 2019-03-01,因此他不算在 2019-06-21 的的统计内。

1.2 思路:

首次登录=>排名第一=>窗口函数

row_number函数。

1.3 题解:

-- 首次登录=>排名第一=>窗口函数
-- 先得到activity全是login的记录
with tep as (select user_id, activity , activity_date, row_number() over (partition by user_id order by activity_date) ranksfrom Trafficwhere activity = 'login'
)
-- 然后将用户首次登录(排名第一)的过滤出来
-- 再activity_date分组查询即可
select activity_date login_date, count(*) user_count
from tep
where ranks = 1
group by activity_date
having activity_date >= '2019-04-01'

2. 力扣1112:每位学生的最高成绩

2.1 题目;

表:Enrollments

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| student_id    | int     |
| course_id     | int     |
| grade         | int     |
+---------------+---------+
(student_id, course_id) 是该表的主键(具有唯一值的列的组合)。
grade 不会为 NULL。

编写解决方案,找出每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 course_id 最小的一门。查询结果需按 student_id 增序进行排序。

查询结果格式如下所示。

示例 1:

输入:
Enrollments 表:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 2          | 2         | 95    |
| 2          | 3         | 95    |
| 1          | 1         | 90    |
| 1          | 2         | 99    |
| 3          | 1         | 80    |
| 3          | 2         | 75    |
| 3          | 3         | 82    |
+------------+-----------+-------+
输出:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 1          | 2         | 99    |
| 2          | 2         | 95    |
| 3          | 3         | 82    |
+------------+-----------+-------+

2.2 思路:

题目看到最高=>排名第一=>窗口函数

where ranks = 1过滤得到第一名。

2.3 题解:

-- 题目看到最高=>排名第一=>窗口函数
with tep as (select student_id, course_id, grade, rank() over (partition by student_id order by grade desc, course_id, student_id) ranksfrom Enrollments
)select student_id, course_id, grade
from tep
where ranks = 1

3. 力扣1077:项目员工3

3.1 题目:

项目表 Project

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| project_id  | int     |
| employee_id | int     |
+-------------+---------+
(project_id, employee_id) 是这个表的主键(具有唯一值的列的组合)
employee_id 是员工表 Employee 的外键(reference 列)
该表的每一行都表明具有 employee_id 的雇员正在处理具有 project_id 的项目。

员工表 Employee

+------------------+---------+
| Column Name      | Type    |
+------------------+---------+
| employee_id      | int     |
| name             | varchar |
| experience_years | int     |
+------------------+---------+
employee_id 是这个表的主键(具有唯一值的列)
该表的每一行都包含一名雇员的信息。

编写解决方案,报告在每一个项目中 经验最丰富 的雇员是谁。如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工。

返回结果表 无顺序要求 。

结果格式如下示例所示。

示例 1:

输入:
Project 表:
+-------------+-------------+
| project_id  | employee_id |
+-------------+-------------+
| 1           | 1           |
| 1           | 2           |
| 1           | 3           |
| 2           | 1           |
| 2           | 4           |
+-------------+-------------+Employee 表:
+-------------+--------+------------------+
| employee_id | name   | experience_years |
+-------------+--------+------------------+
| 1           | Khaled | 3                |
| 2           | Ali    | 2                |
| 3           | John   | 3                |
| 4           | Doe    | 2                |
+-------------+--------+------------------+
输出:
+-------------+---------------+
| project_id  | employee_id   |
+-------------+---------------+
| 1           | 1             |
| 1           | 3             |
| 2           | 1             |
+-------------+---------------+
解释:employee_id 为 1 和 3 的员工在 project_id 为 1 的项目中拥有最丰富的经验。在 project_id 为 2 的项目中,employee_id 为 1 的员工拥有最丰富的经验。

3.2 思路:

-- 经验最丰富=>经验第一=>一眼窗口函数

where ranks = 1筛选出第一名。

3.3 题解:

-- 经验最丰富=>经验第一=>一眼窗口函数with tep as (select project_id, p.employee_id employee_id, dense_rank() over (partition by project_id order by experience_years desc) ranksfrom Project pjoin Employee e on p.employee_id  = e.employee_id 
)select project_id, employee_id
from tep
where ranks = 1

http://www.lryc.cn/news/459278.html

相关文章:

  • 计算机网络(十一) —— 数据链路层
  • 使用PyTorch从0实现Fashion-MNIST数据集分类
  • Java数组的值拷贝和地址拷贝
  • 类与对象 中(剩余部分) 以及 日历
  • iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案
  • 【C#生态园】完整解读C#网络通信库:从基础到实战应用
  • js面试题---事件委托是什么
  • 谷歌浏览器 文件下载提示网络错误
  • 【记录】PPT|PPT 箭头相交怎么跨过
  • Linux中如何修改root密码
  • 中间件:SpringBoot集成Redis
  • 数据中心建设方案,大数据平台建设,大数据信息安全管理(各类资料原件)
  • TDD(测试驱动开发)是否已死?
  • Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic
  • 数据结构(一)顺序表
  • 如何在 Jupyter Notebook 执行和学习 SQL 语句(中)
  • AutosarMCAL开发——基于EB Wdg驱动
  • Linux(1. 基本操作_命令)
  • 难点:Linux 死机定位(进程虚拟地址空间耗尽)
  • 小米路由器刷机istoreOS,愉快上网
  • 微信小程序 - 01 - 一些补充和注意点(补充ing...)
  • 微服务实战——登录(普通登录、社交登录、SSO单点登录)
  • windows 安装 ElasticSearch
  • Oracle Linux 9 (CentOS Stream 9) 安装 node.js 20
  • 【Axure安装包与汉化包附带授权证书】
  • SSH隧道验证的原理及实现例子
  • [计算机视觉]chapter1
  • RTKLIB学习记录【postpos、execses_b、execses_r】
  • docker,docker-desktop,docker-compose download
  • C#_带参数的委托进入队列执行