Medium之1532.最近的三笔订单***

表: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
上一篇:三、mybatis多表关联查询和分布查询


下一篇:springCloud