当前位置: 首页 > article >正文

SQL,力扣题目1549,每件商品的最新订单【窗口函数】

一、力扣链接

LeetCode_1549

二、题目描述

表: Customers

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| customer_id   | int     |
| name          | varchar |
+---------------+---------+
customer_id 是该表主键.
该表包含消费者的信息.

表: Orders

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| order_id      | int     |
| order_date    | date    |
| customer_id   | int     |
| product_id    | int     |
+---------------+---------+
order_id 是该表主键.
该表包含消费者customer_id产生的订单.
不会有商品被相同的用户在一天内下单超过一次.

表: Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| product_name  | varchar |
| price         | int     |
+---------------+---------+
product_id 是该表主键.
该表包含所有商品的信息.

写一个解决方案, 找到每件商品的最新订单(可能有多个).

返回的结果以 product_name 升序排列, 如果有排序相同, 再以 product_id 升序排列. 如果还有排序相同, 再以 order_id 升序排列.

三、目标拆解

四、建表语句

Create table If Not Exists Customers (customer_id int, name varchar(10))
Create table If Not Exists Orders (order_id int, order_date date, customer_id int, product_id int)
Create table If Not Exists Products (product_id int, product_name varchar(20), price int)
Truncate table Customers
insert into Customers (customer_id, name) values ('1', 'Winston')
insert into Customers (customer_id, name) values ('2', 'Jonathan')
insert into Customers (customer_id, name) values ('3', 'Annabelle')
insert into Customers (customer_id, name) values ('4', 'Marwan')
insert into Customers (customer_id, name) values ('5', 'Khaled')
Truncate table Orders
insert into Orders (order_id, order_date, customer_id, product_id) values ('1', '2020-07-31', '1', '1')
insert into Orders (order_id, order_date, customer_id, product_id) values ('2', '2020-7-30', '2', '2')
insert into Orders (order_id, order_date, customer_id, product_id) values ('3', '2020-08-29', '3', '3')
insert into Orders (order_id, order_date, customer_id, product_id) values ('4', '2020-07-29', '4', '1')
insert into Orders (order_id, order_date, customer_id, product_id) values ('5', '2020-06-10', '1', '2')
insert into Orders (order_id, order_date, customer_id, product_id) values ('6', '2020-08-01', '2', '1')
insert into Orders (order_id, order_date, customer_id, product_id) values ('7', '2020-08-01', '3', '1')
insert into Orders (order_id, order_date, customer_id, product_id) values ('8', '2020-08-03', '1', '2')
insert into Orders (order_id, order_date, customer_id, product_id) values ('9', '2020-08-07', '2', '3')
insert into Orders (order_id, order_date, customer_id, product_id) values ('10', '2020-07-15', '1', '2')
Truncate table Products
insert into Products (product_id, product_name, price) values ('1', 'keyboard', '120')
insert into Products (product_id, product_name, price) values ('2', 'mouse', '80')
insert into Products (product_id, product_name, price) values ('3', 'screen', '600')
insert into Products (product_id, product_name, price) values ('4', 'hard disk', '450')

五、过程分析

1、最新订单为日期最晚的订单,需要降序

2、选择排序为1的即为最新

六、代码实现

with t1 as(
select order_id, order_date, product_id,
       rank() over(partition by product_id order by order_date desc) rn
from orders
)
select (select product_name from products p where p.product_id = t1.product_id) product_name, 
       product_id, order_id, order_date
from t1 where rn = 1
order by product_name, product_id, order_id;

七、结果验证

八、小结

1、求最值,可以考虑排序

2、与力扣题目184 ,1077 思路一致

3、CTE 表达式 + 排名函数 + 子查询


http://www.kler.cn/a/377680.html

相关文章:

  • Chrome 130 版本开发者工具(DevTools)更新内容
  • 深入理解 Spring Boot 中的 @PathVariable 注解
  • RuoYi 样例框架运行步骤(测试项目自用,同学可自取)
  • 再探“构造函数”(2)友元and内部类
  • 使用Kafka构建大规模消息传递系统
  • Redis安装与使用 + Springboot整合Redis
  • 实现GUI界面中的logo图片的编码与隐藏
  • 基于vue3和elementPlus的el-tree组件,实现树结构穿梭框,支持数据回显和懒加载
  • mfc140u.dll丢失怎么办? mfc140u.dll文件缺失的修复技巧
  • 机器视觉基础—双目相机
  • Python 三维图表绘制指南
  • 一文囊括风控建模中的变量筛选方法
  • Linux 下执行定时任务之 Systemd Timers
  • Vue问题汇总解决
  • 【Centos】在 CentOS 9 上使用 Apache 搭建 PHP 8 教程
  • Vue插槽的使用场景
  • 垃圾材质分类图像图像分割系统:操作简易训练
  • 【MVP】浅析MVP内存泄漏
  • 20.体育馆使用预约系统(基于springboot和vue的Java项目)
  • ES8388 —— 带耳机放大器的低功耗立体声音频编解码器(4)
  • uniapp ,微信小程序,滚动(下滑,上拉)到底部加载下一页内容
  • 网络编程(Day35)
  • 实用篇:linux如何查看历史命令(以前使用过的命令)
  • 【MyBatis源码】SqlSource对象创建流程
  • 微信聊天记录删了怎样才能恢复?试试这10款数据恢复软件
  • 有季节效应的非平稳序列分析