SQL-聚合函数-1174. 即时食物配送II
解题思路:
其实大体思路都有,但是不知道排序之后的第一行怎么选择。
首先用一个子查询,分组后利用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;