表:Customers
Column Name | Type |
---|---|
customer_id | int |
name | varchar |
customer_id 是该表主键
该表包含消费者的信息
表:Orders
Column Name | Type |
---|---|
order_id | int |
order_date | date |
customer_id | int |
cost | int |
order_id 是该表主键
该表包含id为customer_id的消费者的订单信息
每一个消费者 每天一笔订单
问题
写一个 SQL 语句,找到每个用户的最近三笔订单。如果用户的订单少于 3 笔,则返回他的全部订单。
返回的结果按照 customer_name 升序排列。如果排名有相同,则继续按照 customer_id 升序排列。如果排名还有相同,则继续按照 order_date 降序排列。
示例
Customers
customer_id | name |
---|---|
1 | Winston |
2 | Jonathan |
3 | Annabelle |
4 | Marwan |
5 | Khaled |
Orders
order_id | order_date | customer_id | cost |
---|---|---|---|
1 | 2020-07-31 | 1 | 30 |
2 | 2020-07-30 | 2 | 40 |
3 | 2020-07-31 | 3 | 70 |
4 | 2020-07-29 | 4 | 100 |
5 | 2020-06-10 | 1 | 1010 |
6 | 2020-08-01 | 2 | 102 |
7 | 2020-08-01 | 3 | 111 |
8 | 2020-08-03 | 1 | 99 |
9 | 2020-08-07 | 2 | 32 |
10 | 2020-07-15 | 1 | 2 |
Result table:
customer_name | customer_id | order_id | order_date |
---|---|---|---|
Annabelle | 3 | 7 | 2020-08-01 |
Annabelle | 3 | 3 | 2020-07-31 |
Jonathan | 2 | 9 | 2020-08-07 |
Jonathan | 2 | 6 | 2020-08-01 |
Jonathan | 2 | 2 | 2020-07-30 |
Marwan | 4 | 4 | 2020-07-29 |
Winston | 1 | 8 | 2020-08-03 |
Winston | 1 | 1 | 2020-07-31 |
Winston | 1 | 10 | 2020-07-15 |
Winston 有 4 笔订单, 排除了 “2020-06-10” 的订单, 因为它是最老的订单。
Annabelle 只有 2 笔订单, 全部返回。
Jonathan 恰好有 3 笔订单。
Marwan 只有 1 笔订单。
结果表我们按照 customer_name 升序排列,customer_id 升序排列,order_date 降序排列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/the-most-recent-three-orders
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
法一:窗口函数
select name as customer_name,t.customer_id,order_id,order_date
from (
select order_id,order_date,customer_id,
row_number() over(partition by customer_id order by order_date desc) rw
from orders) t
join customers c on t.customer_id=c.customer_id
where rw<=3
order by name,customer_id,order_date desc
注意:窗口函数里面over(partition by 后面一定要跟上order by order_date desc)
法二:内连接——没懂
select name as customer_name,o1.customer_id,o1.order_id,o1.order_date
from orders o1,orders o2,customers c
where o1.customer_id=o2.customer_id and o1.order_date<=o2.order_date and o1.customer_id=c.customer_id
group by o1.order_id
having count(o2.order_date)<=3
order by name,customer_id,order_date desc