能力验证
通过SQL查询分析用户注册后首次购买时间分布、前十消费品类排名、复购率最高商品类别及月度销售趋势,验证数据分析能力。
用户注册后多久会进行第一次购买?
sql语句
结果集
| 时间区间 | 用户数量 | 占比 |
|---|---|---|
| 注册前已购买 | 1,682 | 33.64% |
| 当天 | 6 | 0.12% |
| 1-3天 | 4 | 0.08% |
| 3-7天 | 20 | 0.40% |
| 1-2周 | 32 | 0.64% |
| 2-4周 | 73 | 1.46% |
| 1-3个月 | 261 | 5.22% |
| 3-6个月 | 399 | 7.98% |
| 6-12个月 | 865 | 17.30% |
| 1年以上 | 1,658 | 33.16% |
用户前十消费品类的排名
sql语句
结果集
| 用户名 | 第一偏好 | 第二偏好 | 第三偏好 |
|---|---|---|---|
| smartstar3024 | 家居家装 | 手机数码 | 珠宝首饰 |
| happyqueen4187 | 图书音像 | 手机数码 | 汽车用品 |
| smartking4574 | 食品生鲜 | 家居家装 | 手机数码 |
| luckyexpert3078 | 珠宝首饰 | 图书音像 | 食品生鲜 |
| smartlove3043 | 珠宝首饰 | 运动户外 | 服装鞋帽 |
| luckystar197 | 美妆护肤 | 食品生鲜 | 家用电器 |
| brightking4490 | 电脑办公 | 家居家装 | 图书音像 |
| sunnyuser2268 | 母婴玩具 | 家居家装 | 家用电器 |
| cleverqueen1790 | 家用电器 | 手机数码 | 图书音像 |
| happyfan1244 | 家居家装 | 电脑办公 | 家用电器 |
复购率最高的五类商品是什么?
sql语句
结果集
| 商品类别 | 总用户数 | 平均购买次数 | 最大购买次数 | 中位数购买次数 |
|---|---|---|---|---|
| 珠宝首饰 | [具体总用户数1] | 37.22 | 61 | 37 |
| 手机数码 | [具体总用户数2] | 37.02 | 62 | 37 |
| 家居家装 | [具体总用户数3] | 36.74 | 64 | 37 |
| 家用电器 | [具体总用户数4] | 36.54 | 64 | 36 |
| 食品生鲜 | [具体总用户数5] | 36.36 | 60 | 36 |
各商品类别的月度销售趋势如何变化?
sql语句
结果集
quarter category quarterly_sales qoq_growth
2024-1 家居家装 134811711.73
2024-1 美妆护肤 132610366.91
2024-1 家用电器 132042525.19
2024-1 珠宝首饰 129668976.89
2024-1 汽车用品 129349553.68
2024-1 母婴玩具 129107769.24
2024-1 手机数码 127875185.00
2024-1 电脑办公 127758482.02
2024-1 图书音像 126436730.06
2024-1 运动户外 121591115.47
2024-1 服装鞋帽 121519012.24
2024-1 食品生鲜 120206743.36
2024-2 家用电器 1449094882.71 997.45
2024-2 家居家装 1433076102.71 963.02
2024-2 汽车用品 1397376820.91 980.31
WITH first_purchase AS (
SELECT
o.user_id,
u.registration_time,
MIN(o.create_time) AS first_order_time,
EXTRACT(EPOCH FROM (MIN(o.create_time) - u.registration_time)) / 86400 AS days_to_first_purchase
FROM
orders o
JOIN
users u ON o.user_id = u.user_id
WHERE
o.order_status > 0 -- 假设订单状态大于0表示有效订单
GROUP BY
o.user_id, u.registration_time
),
time_ranges AS (
SELECT
CASE
WHEN days_to_first_purchase < 0 THEN '注册前已购买'
WHEN days_to_first_purchase BETWEEN 0 AND 1 THEN '当天'
WHEN days_to_first_purchase BETWEEN 1 AND 3 THEN '1-3天'
WHEN days_to_first_purchase BETWEEN 3 AND 7 THEN '3-7天'
WHEN days_to_first_purchase BETWEEN 7 AND 14 THEN '1-2周'
WHEN days_to_first_purchase BETWEEN 14 AND 30 THEN '2-4周'
WHEN days_to_first_purchase BETWEEN 30 AND 90 THEN '1-3个月'
WHEN days_to_first_purchase BETWEEN 90 AND 180 THEN '3-6个月'
WHEN days_to_first_purchase BETWEEN 180 AND 365 THEN '6-12个月'
ELSE '1年以上'
END AS time_range,
COUNT(*) AS user_count
FROM
first_purchase
GROUP BY
CASE
WHEN days_to_first_purchase < 0 THEN '注册前已购买'
WHEN days_to_first_purchase BETWEEN 0 AND 1 THEN '当天'
WHEN days_to_first_purchase BETWEEN 1 AND 3 THEN '1-3天'
WHEN days_to_first_purchase BETWEEN 3 AND 7 THEN '3-7天'
WHEN days_to_first_purchase BETWEEN 7 AND 14 THEN '1-2周'
WHEN days_to_first_purchase BETWEEN 14 AND 30 THEN '2-4周'
WHEN days_to_first_purchase BETWEEN 30 AND 90 THEN '1-3个月'
WHEN days_to_first_purchase BETWEEN 90 AND 180 THEN '3-6个月'
WHEN days_to_first_purchase BETWEEN 180 AND 365 THEN '6-12个月'
ELSE '1年以上'
END
)
SELECT
time_range,
user_count,
ROUND((user_count * 100.0 / (SELECT SUM(user_count) FROM time_ranges)), 2) AS percentage
FROM
time_ranges
ORDER BY
CASE time_range
WHEN '注册前已购买' THEN 0
WHEN '当天' THEN 1
WHEN '1-3天' THEN 2
WHEN '3-7天' THEN 3
WHEN '1-2周' THEN 4
WHEN '2-4周' THEN 5
WHEN '1-3个月' THEN 6
WHEN '3-6个月' THEN 7
WHEN '6-12个月' THEN 8
ELSE 9
END;WITH top_users AS (
SELECT
o.user_id
FROM
orders o
WHERE
o.order_status > 0
GROUP BY
o.user_id
ORDER BY
SUM(o.total_amount) DESC
LIMIT 10
),
user_category_preference AS (
SELECT
o.user_id,
p.category,
SUM(oi.subtotal) AS category_spending,
RANK() OVER (PARTITION BY o.user_id ORDER BY SUM(oi.subtotal) DESC) AS category_rank
FROM
orders o
JOIN
order_items oi ON o.order_id = oi.order_id
JOIN
products p ON oi.product_id = p.product_id
WHERE
o.user_id IN (SELECT user_id FROM top_users)
AND o.order_status > 0
GROUP BY
o.user_id, p.category
)
SELECT
u.user_id,
u.username,
ucp.category,
ucp.category_spending,
ucp.category_rank
FROM
user_category_preference ucp
JOIN
users u ON ucp.user_id = u.user_id
WHERE
ucp.category_rank <= 3
ORDER BY
u.user_id, ucp.category_rank;WITH category_purchases AS (
SELECT
u.user_id,
p.category,
COUNT(DISTINCT o.order_id) AS purchase_count
FROM
users u
JOIN
orders o ON u.user_id = o.user_id
JOIN
order_items oi ON o.order_id = oi.order_id
JOIN
products p ON oi.product_id = p.product_id
WHERE
o.order_status > 0
GROUP BY
u.user_id, p.category
)
SELECT
category,
COUNT(DISTINCT user_id) AS total_users,
ROUND(AVG(purchase_count), 2) AS avg_purchase_count,
MAX(purchase_count) AS max_purchase_count,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY purchase_count) AS median_purchase_count
FROM
category_purchases
GROUP BY
category
ORDER BY
avg_purchase_count DESC
LIMIT 5;WITH quarterly_sales AS (
SELECT
DATE_TRUNC('quarter', o.create_time) AS quarter,
p.category,
SUM(oi.subtotal) AS quarterly_sales
FROM
orders o
JOIN
order_items oi ON o.order_id = oi.order_id
JOIN
products p ON oi.product_id = p.product_id
WHERE
o.order_status > 0
AND o.create_time >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY
DATE_TRUNC('quarter', o.create_time), p.category
)
SELECT
TO_CHAR(quarter, 'YYYY-Q') AS quarter,
category,
quarterly_sales,
ROUND((quarterly_sales / LAG(quarterly_sales) OVER (PARTITION BY category ORDER BY quarter) - 1) * 100, 2) AS qoq_growth
FROM
quarterly_sales
ORDER BY
quarter, quarterly_sales DESC;