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,把最早时间的那条记录弄出来。

相关推荐

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

    2024-01-26 09:50:01       32 阅读
  2. 【LeetCode】1174. 即时食物配送 II

    2024-01-26 09:50:01       37 阅读
  3. | 分享】高频 SQL 50 题(基础版)

    2024-01-26 09:50:01       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 09:50:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 09:50:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 09:50:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 09:50:01       20 阅读

热门阅读

  1. day31_CSS

    day31_CSS

    2024-01-26 09:50:01      30 阅读
  2. 面试 Vue 框架八股文十问十答第十一期

    2024-01-26 09:50:01       26 阅读
  3. 考研机试 阶乘的和

    2024-01-26 09:50:01       31 阅读
  4. 五种单例模式

    2024-01-26 09:50:01       28 阅读
  5. Midjourney 生成图片教程

    2024-01-26 09:50:01       49 阅读
  6. C++(1) 命名空间

    2024-01-26 09:50:01       34 阅读
  7. 牛刀小试 - C++ 推箱子小游戏

    2024-01-26 09:50:01       39 阅读
  8. Android - 持久化方案

    2024-01-26 09:50:01       29 阅读