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

2024-01-25 力扣高频SQL50题目1174. 即时食物配送

题目如下:

配送表: Delivery

+-----------------------------+---------+
| Column Name                 | Type    |
+-----------------------------+---------+
| delivery_id                 | int     |
| customer_id                 | int     |
| order_date                  | date    |
| customer_pref_delivery_date | date    |
+-----------------------------+---------+
delivery_id 是该表中具有唯一值的列。
该表保存着顾客的食物配送信息,顾客在某个日期下了订单,并指定了一个期望的配送日期(和下单日期相同或者在那之后)。

如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。

首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。

编写解决方案以获取即时订单在所有用户的首次订单中的比例。保留两位小数。

------

这个题目还是很有意思的。

一开始,我以为即时订单总量/所有用户首次订单数总量。

-- 不对

-- select round((sum(if(order_date=customer_pref_delivery_date,1,0))/count(distinct customer_id )),4)*100 as immediate_percentage  from Delivery

-- 不对

-- select round((sum(if(order_date=customer_pref_delivery_date,1,0))/(select distinct count( customer_id )from Delivery ))*100,2) as immediate_percentage  from Delivery

-- 不对

-- select round((sum(if(order_date=customer_pref_delivery_date,1,0))/(select  COUNT(DISTINCT customer_id) from Delivery ))*100,2) as immediate_percentage  from Delivery

-- 我看了下其他人答案,发现自己理解错了。

"即时订单在所有用户的首次订单中的比例"。

应该是 所有用户的首次订单中的即时订单总数 / 所有用户的首次订单量

所以,需要框定范围,首次订单

-- 不对

-- select round((sum(if(order_date=customer_pref_delivery_date,1,0))/(select  COUNT(DISTINCT customer_id) from Delivery  ))*100,2) as immediate_percentage  from Delivery group by customer_id


正确的写法:

-- 没用rownumber的解法

-- select round((sum(if(order_date=customer_pref_delivery_date,1,0))/(select  COUNT(DISTINCT customer_id) from Delivery  ))*100,2) as immediate_percentage  from Delivery where (customer_id, order_date) in (

select customer_id, min(order_date)

from delivery

group by customer_id )

-- 用rownumber的解法

-- SELECT round((sum(if(order_date=customer_pref_delivery_date,1,0))/(SELECT COUNT(DISTINCT customer_id) FROM Delivery))*100, 2) AS immediate_percentage

-- FROM

 (SELECT *, ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date) AS rn   FROM Delivery) AS subquery WHERE rn = 1;

--用rownumber的解法 + count(*)

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 rn

  FROM Delivery) AS subquery

WHERE rn = 1;

最后这个是比较好。直接将【首次订单】作为from来源的数据,count(*)因为where已经把条件框定了。

如何框定的?用row_number,把最早时间的那条记录弄出来。

http://www.lryc.cn/news/287959.html

相关文章:

  • java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测
  • Java转成m3u8,hls格式
  • jmeter之接口测试实现参数化(利用函数助手),参数值为1-9(自增的数字)
  • 如何在 Ubuntu 22.04 上安装 Apache Web 服务器
  • 【python爬虫】爬虫编程技术的解密与实战
  • VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法
  • Python模块与包:扩展功能、提高效率的利器
  • 【每日一题】4.LeetCode——杨辉三角
  • 蓝桥杯(Python)每日练Day5
  • SpringCloud(二)
  • 【java】常见的面试问题
  • 虚幻UE 插件-像素流送实现和优化
  • Vue2 props组件通信
  • 重构改善既有代码的设计-学习(三):重新组织数据
  • 群狼调研(长沙品牌忠诚度测试)|广告效果测评方法
  • Gradle学习笔记:Gradle的使用方法
  • 少儿编程 2023年12月电子学会图形化编程等级考试Scratch二级真题解析(选择题)
  • 基于Java+SpringMvc+vue+element实现上海汽车博物馆平台
  • Sybase PowerDesigner15安装配置
  • 基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)
  • 【数据结构】数据结构初识
  • java多线程测试websocket demo(使用文件流)
  • Tosei 自助网络店铺管理系统network_test.php_RCE漏洞复现
  • uni-app 国际化
  • git:git reset 和 git revert
  • LeetCode:670. 最大交换(Java 贪心)
  • 【STM32】STM32学习笔记-Unix时间戳(41)
  • 2016年认证杯SPSSPRO杯数学建模B题(第一阶段)低分辨率下看世界全过程文档及程序
  • 16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)