LeetCode SQL专项练习 (7) 计算函数分组统计

news/2024/7/24 8:04:05 标签: leetcode, sql, 算法

LeetCode SQL专项练习 计算函数&分组统计

  • 1141. 查询近30天活跃用户数
  • 1693. 每天的领导和合伙人
  • 1729. 求关注者的数量

1141. 查询近30天活跃用户数

活动记录表:Activity

sql">+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| session_id    | int     |
| activity_date | date    |
| activity_type | enum    |
+---------------+---------+
该表是用户在社交网站的活动记录。
该表没有主键,可能包含重复数据。
activity_type 字段为以下四种值 ('open_session', 'end_session', 'scroll_down', 'send_message')。
每个 session_id 只属于一个用户

请写SQL查询出截至 2019-07-27(包含2019-07-27),近 30 天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)。

以 任意顺序 返回结果表。

查询结果示例如下。

sql">输入:
Activity table:
+---------+------------+---------------+---------------+
| user_id | session_id | activity_date | activity_type |
+---------+------------+---------------+---------------+
| 1       | 1          | 2019-07-20    | open_session  |
| 1       | 1          | 2019-07-20    | scroll_down   |
| 1       | 1          | 2019-07-20    | end_session   |
| 2       | 4          | 2019-07-20    | open_session  |
| 2       | 4          | 2019-07-21    | send_message  |
| 2       | 4          | 2019-07-21    | end_session   |
| 3       | 2          | 2019-07-21    | open_session  |
| 3       | 2          | 2019-07-21    | send_message  |
| 3       | 2          | 2019-07-21    | end_session   |
| 4       | 3          | 2019-06-25    | open_session  |
| 4       | 3          | 2019-06-25    | end_session   |
+---------+------------+---------------+---------------+
输出:
+------------+--------------+ 
| day        | active_users |
+------------+--------------+ 
| 2019-07-20 | 2            |
| 2019-07-21 | 2            |
+------------+--------------+ 
解释:注意非活跃用户的记录不需要展示。

来源:力扣(LeetCode)

题解1:
要点:子查询,datediff

sql">select activity_date day, count(user_id) active_users 
from (
    select distinct user_id,activity_date 
    from Activity
    where datediff('2019-07-27', activity_date)<30 and activity_date<'2019-07-28'
 ) t
 group by activity_date

题解2:
要点:distinct,group by

sql">select activity_date day, count(distinct user_id) active_users 
from Activity 
where  activity_date between '2019-06-28' and '2019-07-28' 
group by activity_date

1693. 每天的领导和合伙人

表:DailySales

sql">+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| date_id     | date    |
| make_name   | varchar |
| lead_id     | int     |
| partner_id  | int     |
+-------------+---------+
该表没有主键。
该表包含日期、产品的名称,以及售给的领导和合伙人的编号。
名称只包含小写英文字母

写一条 SQL 语句,使得对于每一个 date_id 和 make_name,返回不同的 lead_id 以及不同的 partner_id 的数量。

按 任意顺序 返回结果表。

查询结果格式如下示例所示。

sql">输入:
DailySales 表:
+-----------+-----------+---------+------------+
| date_id   | make_name | lead_id | partner_id |
+-----------+-----------+---------+------------+
| 2020-12-8 | toyota    | 0       | 1          |
| 2020-12-8 | toyota    | 1       | 0          |
| 2020-12-8 | toyota    | 1       | 2          |
| 2020-12-7 | toyota    | 0       | 2          |
| 2020-12-7 | toyota    | 0       | 1          |
| 2020-12-8 | honda     | 1       | 2          |
| 2020-12-8 | honda     | 2       | 1          |
| 2020-12-7 | honda     | 0       | 1          |
| 2020-12-7 | honda     | 1       | 2          |
| 2020-12-7 | honda     | 2       | 1          |
+-----------+-----------+---------+------------+
输出:
+-----------+-----------+--------------+-----------------+
| date_id   | make_name | unique_leads | unique_partners |
+-----------+-----------+--------------+-----------------+
| 2020-12-8 | toyota    | 2            | 3               |
| 2020-12-7 | toyota    | 1            | 2               |
| 2020-12-8 | honda     | 2            | 2               |
| 2020-12-7 | honda     | 3            | 2               |
+-----------+-----------+--------------+-----------------+
解释:
在 2020-12-8,丰田(toyota)有领导者 = [0, 1] 和合伙人 = [0, 1, 2] ,同时本田(honda)有领导者 = [1, 2] 和合伙人 = [1, 2]。
在 2020-12-7,丰田(toyota)有领导者 = [0] 和合伙人 = [1, 2] ,同时本田(honda)有领导者 = [0, 1, 2] 和合伙人 = [1, 2]。

来源:力扣(LeetCode)

题解:
要点:分组查询,去重

sql">select date_id,make_name,count(distinct lead_id) unique_leads, count(distinct partner_id) unique_partners
from DailySales
group by date_id,make_name;

1729. 求关注者的数量

表: Followers

sql">+-------------+------+
| Column Name | Type |
+-------------+------+
| user_id     | int  |
| follower_id | int  |
+-------------+------+
(user_id, follower_id) 是这个表的主键。
该表包含一个关注关系中关注者和用户的编号,其中关注者关注用户

写出 SQL 语句,对于每一个用户,返回该用户的关注者数量。

按 user_id 的顺序返回结果表。

查询结果的格式如下示例所示

sql">输入:
Followers 表:
+---------+-------------+
| user_id | follower_id |
+---------+-------------+
| 0       | 1           |
| 1       | 0           |
| 2       | 0           |
| 2       | 1           |
+---------+-------------+
输出:
+---------+----------------+
| user_id | followers_count|
+---------+----------------+
| 0       | 1              |
| 1       | 1              |
| 2       | 2              |
+---------+----------------+
解释:
0 的关注者有 {1}
1 的关注者有 {0}
2 的关注者有 {0,1}

来源:力扣(LeetCode)

题解:

sql">select user_id,count(*) followers_count
from Followers
group by user_id
order by user_id

http://www.niftyadmin.cn/n/1371719.html

相关文章

LeetCode SQL专项练习 (6) 合并多表查询

LeetCode SQL专项练习 合并&多表查询197. 上升的温度607. 销售员197. 上升的温度 表&#xff1a; Weather ------------------------ | Column Name | Type | ------------------------ | id | int | | recordDate | date | | temperature |…

使用iconfont-阿里巴巴矢量图标库

把你看上的图标加入购物车&#xff08;可加入多个&#xff09; 没有就新建一个 然后引用要这样

LeetCode SQL专项练习 (8) 计算函数

LeetCode SQL专项练习 计算函数586. 订单最多的客户511. 游戏玩法分析 I1890. 2020年最后一次登录1741. 查找每个员工花费的总时间586. 订单最多的客户 表: Orders --------------------------- | Column Name | Type | --------------------------- | order_number …

LeetCode SQL专项练习 (9) 控制流

LeetCode SQL专项练习 控制流1393. 股票的资本损益1407. 排名靠前的旅行者1158. 市场分析 I1393. 股票的资本损益 Stocks 表 ------------------------ | Column Name | Type | ------------------------ | stock_name | varchar | | operation | enum | | op…

LeetCode SQL专项练习 (10) 过滤

LeetCode SQL专项练习 过滤182. 查找重复的电子邮箱1050. 合作过至少三次的演员和导演1587. 银行账户概要 II1084. 销售分析III182. 查找重复的电子邮箱 编写一个 SQL 查询&#xff0c;查找 Person 表中所有重复的电子邮箱。 ------------- | Id | Email | ------------- |…

小程序缓存 小程序缓存和web缓存的区别

//获取本地的接口数据const minedata wx.getStorageSync("minedata");//如果本地数据不存在if (!minedata) {//调用方法调用数据this.getgoodslist()} else {if (Date.now() - minedata.time > 1000 * 300) {//如果数据过了//调用方法调用数据this.getgoodslist(…