Skip to content

Commit f0ddc02

Browse files
committed
Fix Immediate Food Delivery II solutions: handle edge cases and prevent side effects
1 parent 04a4996 commit f0ddc02

2 files changed

Lines changed: 30 additions & 14 deletions

File tree

SQL/Leetcode/Intermediate Join/1174. Immediate Food Delivery II/Claude Sonnet 4.5 Extended/Immediate_Food_Delivery_II_pandas.md

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
4747
# 即日配達判定(order_date == customer_pref_delivery_date)
4848
is_immediate = (first_orders['order_date'] == first_orders['customer_pref_delivery_date'])
4949

50-
# 割合を計算(パーセンテージ、小数点2桁)
51-
percentage = round(100.0 * is_immediate.sum() / len(is_immediate), 2)
50+
# 割合を計算(パーセンテージ、小数点2桁)
51+
if is_immediate.empty:
52+
percentage = 0.0
53+
else:
54+
percentage = round(100.0 * is_immediate.sum() / len(is_immediate), 2)
5255

5356
return pd.DataFrame({'immediate_percentage': [percentage]})
5457
```
@@ -62,15 +65,20 @@ def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
6265
# Memory 68.14 MB
6366
# Beats 52.06%
6467
def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
65-
# 各顧客内でorder_dateの昇順ランク付け
66-
delivery['rn'] = delivery.groupby('customer_id')['order_date'].rank(method='first', ascending=True)
68+
# 各顧客内でorder_dateの昇順ランク付け(元のDataFrameを変更しない)
69+
delivery_with_rank = delivery.assign(
70+
rn=delivery.groupby('customer_id')['order_date'].rank(method='first', ascending=True)
71+
)
6772

6873
# 最初の注文のみ抽出
69-
first_orders = delivery.loc[delivery['rn'] == 1]
74+
first_orders = delivery_with_rank.loc[delivery_with_rank['rn'] == 1]
7075

7176
# 即日配達判定と集計
7277
is_immediate = (first_orders['order_date'] == first_orders['customer_pref_delivery_date'])
73-
percentage = round(100.0 * is_immediate.sum() / len(is_immediate), 2)
78+
if is_immediate.empty:
79+
percentage = 0.0
80+
else:
81+
percentage = round(100.0 * is_immediate.sum() / len(is_immediate), 2)
7482

7583
return pd.DataFrame({'immediate_percentage': [percentage]})
7684
```
@@ -88,12 +96,17 @@ def immediate_food_delivery(delivery: pd.DataFrame) -> pd.DataFrame:
8896
# 各顧客の最小order_dateを全行に展開
8997
min_order_date = delivery.groupby('customer_id')['order_date'].transform('min')
9098

91-
# 最初の注文のみ抽出
92-
first_orders = delivery[delivery['order_date'] == min_order_date]
99+
# 最初の注文のみ抽出(同じorder_dateが複数ある場合は1行のみ)
100+
first_orders = delivery[delivery['order_date'] == min_order_date].drop_duplicates(
101+
subset=['customer_id', 'order_date']
102+
)
93103

94104
# 即日配達判定と集計
95105
is_immediate = (first_orders['order_date'] == first_orders['customer_pref_delivery_date'])
96-
percentage = round(100.0 * is_immediate.sum() / len(is_immediate), 2)
106+
if is_immediate.empty:
107+
percentage = 0.0
108+
else:
109+
percentage = round(100.0 * is_immediate.sum() / len(is_immediate), 2)
97110

98111
return pd.DataFrame({'immediate_percentage': [percentage]})
99112
```

SQL/Leetcode/Intermediate Join/1174. Immediate Food Delivery II/Claude Sonnet 4.5 Extended/Immediate_Food_Delivery_II_postgre.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ WITH first_orders AS (
3535
FROM Delivery
3636
)
3737
SELECT
38-
ROUND(
39-
100.0 * SUM(CASE WHEN order_date = customer_pref_delivery_date THEN 1 ELSE 0 END)
40-
/ COUNT(*),
41-
2
38+
COALESCE(
39+
ROUND(
40+
100.0 * SUM(CASE WHEN order_date = customer_pref_delivery_date THEN 1 ELSE 0 END)
41+
/ COUNT(*),
42+
2
43+
),
44+
0.0
4245
) AS immediate_percentage
4346
FROM first_orders
4447
WHERE rn = 1;
@@ -62,7 +65,7 @@ WITH first_orders AS (
6265
)
6366
SELECT
6467
ROUND(
65-
100.0 * AVG(is_immediate::int),
68+
100.0 * COALESCE(AVG(is_immediate::int), 0.0),
6669
2
6770
) AS immediate_percentage
6871
FROM first_orders

0 commit comments

Comments
 (0)