能力验证

通过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

sql65 行
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;
sql45 行
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;
sql31 行
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;
sql26 行
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;