oc-p05-customer-segmentation/P5_01_script_052025.sql
2025-11-11 08:39:23 +01:00

86 lines
No EOL
2.7 KiB
SQL

-- 1) 3 months old or less orders received more than 3 days after expected date.
WITH last_date AS (
SELECT MAX(MAX(
order_purchase_timestamp,
order_approved_at,
order_delivered_carrier_date,
order_delivered_customer_date,
order_estimated_delivery_date
)) AS max_date
FROM orders
)
SELECT *
FROM orders
WHERE order_status NOT IN ('unavailable', 'canceled')
AND (julianday((SELECT max_date FROM last_date)) - julianday(order_purchase_timestamp)) < 90
AND julianday(order_delivered_customer_date) - julianday(order_estimated_delivery_date) >= 3;
-- 2) Sellers generating sales of over 100000 reals
-- assuming : price does not have to be multiplied with order_item_id
select seller_id, sum(price)
from order_items
group by seller_id
HAVING sum(price) > 100000;
-- 3) Who are the new sellers (less than 3 months old) who
-- are already very committed to the platform (having already sold more than 30
-- products)?
-- assuming :
-- order_item_id counts the number of items ordered
-- using order_purchase_timestamp is the only way to find a seller first activity
WITH last_date AS (
SELECT MAX(MAX(
order_purchase_timestamp,
order_approved_at,
order_delivered_carrier_date,
order_delivered_customer_date,
order_estimated_delivery_date
)) AS max_date
FROM orders
),
first_sale_dates AS (
SELECT seller_id, MIN(order_purchase_timestamp) as first_sale
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
GROUP BY seller_id
)
SELECT seller_id, sum(order_item_id)
FROM order_items oi
WHERE seller_id IN (
SELECT seller_id
FROM first_sale_dates
WHERE (julianday((SELECT max_date FROM last_date)) - julianday(first_sale)) < 90
)
GROUP BY seller_id
HAVING sum(order_item_id) > 30;
-- 4) What are the 5 zip codes with:
-- more than 30 reviews,
-- the worst average review score over the last 12 months?
-- assuming :
-- zip_code is about the sellers
WITH last_date AS (
SELECT MAX(MAX(
order_purchase_timestamp,
order_approved_at,
order_delivered_carrier_date,
order_delivered_customer_date,
order_estimated_delivery_date
)) AS max_date
FROM orders
)
SELECT
s.seller_zip_code_prefix AS zip_code,
AVG(r.review_score) AS mean_reviews_score,
COUNT(r.review_id) AS reviews_count
FROM sellers s
JOIN order_items oi ON s.seller_id = oi.seller_id
JOIN order_reviews r ON oi.order_id = r.order_id
WHERE julianday((SELECT max_date FROM last_date)) - julianday(r.review_creation_date) <= 365
GROUP BY s.seller_zip_code_prefix
HAVING reviews_count > 30
ORDER BY mean_reviews_score ASC
LIMIT 5;