Forum

Posted by gurpreet, Nov. 30, 2021, 3:19 p.m.

SQL#139

As per the given table 'food_delivery', I have written the following query, but the results are different.
With first_deliveries as (
SELECT first_value(order_id) over (partition by courier_id order by delivered_at) as first_delivery
FROM food_delivery
)
SELECT extract(year from a.delivered_at) as year,
extract(month from a.delivered_at) as mon,
sum(case when a.rating = 1 then 1 else 0 end )*100.0/count(*) as percent
FROM food_delivery a, first_deliveries b
WHERE a.order_id = b.first_delivery
GROUP BY year, mon

Answers

Seemed like your denominator included all orders, we want to limit to the first orders only.
Made a slight change and it starts to work:
With first_deliveries as (
SELECT first_value(order_id) over (partition by courier_id order by delivered_at) as first_delivery_order_id
FROM food_delivery
)
SELECT
extract(year from a.delivered_at) as year,
extract(month from a.delivered_at) as mon,
COUNT(DISTINCT case when a.rating = 1 then first_delivery_order_id else NULL end )*100.0/COUNT(DISTINCT A.order_id) as percent
FROM food_delivery a, first_deliveries b
WHERE a.order_id = b.first_delivery_order_id
GROUP BY year, mon;
SQLPad user avatar

Leon (949)

Dec. 2, 2021, 8:36 a.m.