SQL-聚合函数-1174. 即时食物配送II

发布时间 2023-11-30 09:29:58作者: Offer多多

解题思路:

其实大体思路都有,但是不知道排序之后的第一行怎么选择。

首先用一个子查询,分组后利用min()函数选取order_date最小的行。

SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id

然后进入主查询:

SELECT ROUND(
    SUM(order_date = customer_pref_delivery_date) * 100 / COUNT(*),
    2
) AS immediate_percentage
FROM Delivery
WHERE (customer_id, order_date) IN (
    -- 子查询的结果
    SELECT customer_id, MIN(order_date)
    FROM delivery
    GROUP BY customer_id
)

需要注意几点:

1. Where子查询的关键是要知道它实际上是在使用多列子查询,即子查询返回多列的结果。在本题的子查询中,返回两列。

SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id

这个子查询返回每个客户的最早订单日期,使用min()函数。主查询中WHERE使用IN操作符来匹配(customer_id, order_date)组合是否在子查询的结果中。这样确保了只有每个客户的最早订单对应的行被选中,而不是所有订单日期。

2. “SUM(order_date = customer_pref_delivery_date) * 100 / COUNT(*)”计算符合条件的percentage,count(*)计算所有行的数量,此时所有行都为最早订单。

3. 注意一些小的细节,比如“*100”,“round()”。

4. 学习一下MIN()函数

MIN() 是 SQL 中的聚合函数之一,用于计算指定列的最小值。它通常与 SELECT 语句的 GROUP BY 子句一起使用,以获取每个分组的最小值。

SELECT MIN(column_name) FROM table_name;

或者在与 GROUP BY 一起使用时:

SELECT group_column, MIN(column_name) FROM table_name GROUP BY group_column;