原题链接:http://practice.atguigu.cn/#/question/20/desc?qType=SQL
题目需求
从订单信息表(order_info)中查询出每个用户的最近三个下单日期的所有订单
期望结果如下:
user_id | order_id | create_date |
---|---|---|
101 | 2 | 2021-09-28 |
101 | 3 | 2021-09-29 |
101 | 4 | 2021-09-30 |
102 | 5 | 2021-10-01 |
102 | 6 | 2021-10-01 |
102 | 8 | 2021-10-02 |
103 | 9 | 2021-10-02 |
103 | 10 | 2021-10-02 |
103 | 12 | 2021-10-03 |
104 | 13 | 2021-10-03 |
104 | 14 | 2021-10-03 |
104 | 15 | 2021-10-03 |
105 | 17 | 2021-10-04 |
105 | 18 | 2021-10-04 |
105 | 19 | 2021-10-04 |
106 | 22 | 2021-10-05 |
106 | 23 | 2021-10-05 |
106 | 24 | 2021-10-05 |
107 | 25 | 2021-10-05 |
107 | 27 | 2021-10-06 |
107 | 28 | 2021-10-06 |
108 | 29 | 2021-10-06 |
108 | 31 | 2021-10-07 |
108 | 32 | 2021-10-07 |
109 | 33 | 2021-10-07 |
109 | 35 | 2021-10-08 |
109 | 36 | 2021-10-08 |
1010 | 37 | 2021-10-08 |
1010 | 38 | 2021-10-08 |
1010 | 39 | 2020-10-08 |
需要用到的表:
订单信息表:order_info
order_id (订单id) | user_id (用户id) | create_date (下单日期) | total_amount (订单金额) |
---|---|---|---|
1 | 101 | 2021-09-30 | 29000.00 |
10 | 103 | 2020-10-02 | 28000.00 |
解题思路
SELECT t2.user_id,
t2.order_id,
t2.create_date
FROM
(
SELECT user_id,
create_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_date DESC) AS rn
FROM order_info
GROUP BY user_id,
create_date
) t1
JOIN order_info t2
ON t1.user_id = t2.user_id AND t1.create_date = t2.create_date
WHERE t1.rn <= 3