高频 SQL 50 题(基础版)
*[注:题目来自力扣网 https://leetcode.cn/studyplan/sql-free-50/]
主打一个寒假复健,执行时间大大滴摆烂
1174. 即时食物配送 II
思路:
查询出所有用户的首单数据,除以用户数量——
- 使用GROUP BY子句对 customer_id 进行分组,随后利用MIN函数来找出每个用户的最早订单日期。
- (customer_id, order_date)结果集作为子查询,并与原始订单表通过WHERE IN子句进行匹配,从而筛选出每个用户的第一笔订单详情。
代码:
SELECT
ROUND(SUM(order_date = customer_pref_delivery_date) * 100/ COUNT(*) , 2)
AS immediate_percentage
FROM
Delivery
WHERE
(customer_id, order_date) IN(
SELECT customer_id, min(order_date)
FROM Delivery
GROUP BY customer_id
)
运行结果:
550. 游戏玩法分析 IV
思路:
类似1174
- 求出所有用户首次登录的第二天的时间。查询出 Activity 表中每个用户的第一天时间,并加上 1(若是+数字1忽略每个月最后一天情况,需改为 INTERVAL 1 DAY)
SELECT player_id, DATE(MIN(event_date) + INTERVAL 1 DAY )
FROM activity
GROUP BY player_id
- 统计用 1.得到数据的用户数量,除以用户总数,相除并保留两位小数即可。
代码:
SELECT
IFNULL(
ROUND(
COUNT(distinct player_id)/ (select count(distinct player_id) from activity),2)
,0) AS fraction
FROM
Activity
WHERE (player_id, event_date) in
(
SELECT player_id, DATE(MIN(event_date) + INTERVAL 1 DAY )
FROM activity
GROUP BY player_id
)