前述
推荐学习: 通俗易懂的学会:SQL窗口函数
题目描述
leetcode题目:1174. 即时食物配送 II
写法一:窗口函数
分组排序(以customer_id
分组,按照order_date
排序),窗口函数应用。
select round((sum(if(order_date=customer_pref_delivery_date, 1, 0))/count(*))*100, 2) as immediate_percentage
from (
select *,
row_number() over(partition by customer_id order by order_date) as first_order
from Delivery
) A
where A.first_order = 1
注意:这里要用row_number(), 确保每个用户的首次订单只有一个。
- 如果用dense_rank()或者是rank():例如,当用户1在同一天下了两个订单时,此时会将这两个订单都统计在内,但实际只需要统计一个即可。
rank()、dense_rank()、row_number() 的区别
图片引用自 通俗易懂的学会:SQL窗口函数
写法二: group by
正确写法:
-- 方法二:不用窗口函数, 用group by, right!
-- 再用一次 group by customer_id 把同一个用户的两个订单去重
select round((sum(if(order_date=customer_pref_delivery_date, 1, 0))/count(*))*100, 2) as immediate_percentage
from (
select *
from Delivery
where(customer_id,order_date)in (
select customer_id, min(order_date)
from Delivery
group by customer_id
)
group by customer_id
) A
1. 错误举例一
试图不用窗口函数,直接用group by
下图是错误示例:
错误原因:
2. 错误举例二
定位问题: