SQL166 每天的日活数及新用户占比

SQL166 每天的日活数及新用户占比

题目理解

本SQL查询旨在分析用户活跃数据,计算两个关键指标:

  1. 每日活跃用户数(DAU)
  2. 每日新增用户占比(新用户占活跃用户的比例)

解题思路

1. 数据准备阶段

首先我们需要获取所有用户的活跃记录,包括:

  • 用户进入时间(in_time)
  • 用户离开时间(out_time)

由于一个用户在同一天可能有多次活跃记录,我们需要对数据进行去重处理。


2. 核心计算逻辑

通过三个CTE(Common Table Expressions)分步处理数据:

  1. user_activity_records​:合并所有活跃记录

    • 从in_time和out_time中提取日期
    • 使用UNION合并结果并自动去重
  2. user_first_activity​:计算每个用户的首次活跃日期

    • 按用户分组
    • 使用MIN函数找出每个用户的最早活跃日期
  3. user_activity_with_first_date​:关联活跃记录与首次活跃日期

    • 将活跃记录与用户首次活跃日期关联
    • 为后续计算准备完整数据集

3. 最终指标计算

基于准备好的数据,计算两个核心指标:

  1. daily_active_users​:每日活跃用户数

    • 按日期分组
    • 使用COUNT(*)计算每日不重复用户数
  2. new_user_ratio​:新增用户占比

    • 判断当前活跃日期是否为用户的首次活跃日期
    • 计算新增用户数占总活跃用户数的比例
    • 使用ROUND保留两位小数

技术亮点

  1. UNION自动去重​:高效处理用户可能在同一天多次活跃的情况
  2. CTE分步处理​:使复杂查询逻辑清晰易读
  3. IF条件计数​:优雅地实现条件计数功能
  4. JOIN USING语法​:简化相同列名的连接操作

最终代码

WITH
    -- 获取用户活跃日期(合并in_time和out_time)
    user_activity_records AS (
        SELECT
            uid,
            DATE(in_time) AS activity_date
        FROM
            tb_user_log
        UNION
        SELECT
            uid,
            DATE(out_time) AS activity_date
        FROM
            tb_user_log
    ),
    
    -- 计算每个用户的首次活跃日期
    user_first_activity AS (
        SELECT
            uid,
            MIN(activity_date) AS first_activity_date
        FROM
            user_activity_records
        GROUP BY
            uid
    ),
    
    -- 合并活跃记录和首次活跃日期
    user_activity_with_first_date AS (
        SELECT
            uar.uid,
            uar.activity_date,
            ufa.first_activity_date
        FROM
            user_activity_records uar
        JOIN
            user_first_activity ufa USING (uid)
    )

-- 计算每日活跃用户数和新增用户占比
SELECT
    activity_date,
    COUNT(*) AS daily_active_users,
    ROUND(
        COUNT(IF(first_activity_date = activity_date, 1, NULL)) / COUNT(*),
        2
    ) AS new_user_ratio
FROM
    user_activity_with_first_date
GROUP BY
    activity_date
ORDER BY
    activity_date;

<think>嗯,用户的问题是关于如何用SQL和Excel分析不同订购年份的新老客户销售额及其比。首先,我需要明确用户的需求:他们希望比较各个年份中,新客户和老客户的销售额以及各自的比例。这涉及到客户分类,可能需要根据客户的首次订购年份来判断是新客户还是老客户。 根据引用内容中的用户价值部分[^1],传统营销中将客户分为新客户、老客户等,所以这里需要先定义什么是新客户,什么是老客户。通常,新客户是指在特定年份首次下单的客户,而老客户则是在之前年份已经有过购买的客户。因此,首先需要确定每个客户的首次订购年份,然后根据订单年份和首次年份的关系进行分类。 接下来,据准备方面,引用[2]提到需要先加载据库或据文件,编写SQL进行据处理。因此,第一步应该是通过SQL查询提取必要的据。可能需要使用窗口函来找出每个客户的首次订购年份,比如使用MIN() OVER()来计算每个客户的最小订单年份。然后,将每个订单年份与首次年份比较,判断该订单是否属于新客户。 在SQL部分,可能需要创建CTE或者子查询,先计算每个客户的首次订购年份,然后将订单表与这个首次年份关联起来。例如,使用WITH子句生成一个客户首次年份的临时表,再将其与原始订单表连接,得到每个订单的年份、客户ID、销售额以及该客户的首次年份。之后,通过CASE WHEN语句来判断该订单年份是否等于首次年份,从而标记新老客户。 在Excel部分,根据引用[3],可能需要将SQL导出的据进一步处理,比如使用据透视表来汇总不同年份和客户类型下的销售额。同时,计算比可能需要使用公式,比如每个年份的总销售额中,新客户和老客户的比。此外,图表展示可能需要使用柱形图或饼图来直观显示比例。 需要注意的是,用户提到的引用[4]中提到,据分析应关注套路而非具体idea,因此这里可能需要遵循常见的分析方法,比如按时间维度拆分客户群体,比较他们的贡献值。同时,要确保据准确性,比如处理同一客户在同一年份多次购买的情况,是否需要合并,或者是否每次订单都算作新客户或老客户。 可能遇到的挑战包括如何高效计算客户的首次购买年份,尤其是在大据量的情况下,SQL的性能优化可能需要考虑索引或分区。另外,在Excel中处理大量据时,据透视表可能会比较慢,需要确保据格式正确,比如期字段是否为正确的期格式,销售额是否为值格式等。 最后,用户可能需要具体的步骤指导,包括SQL代码示例和Excel操作步骤,以及结果的可视化方法。同时,是否需要考虑客户流失的情况,比如引用[1]中提到的流失客户,但用户的问题主要集中在新老客户,可能暂时不需要处理流失客户部分。 总结下来,解决步骤应该是:1. SQL提取据并分类;2. Excel汇总和计算比例;3. 可视化展示。需要确保每个步骤的代码和操作正确,并且结果清晰易懂。</think>### 分步解答 #### **1. 据准备与客户分类逻辑** - **目标**:根据客户首次订购年份判断新/老客户 - **SQL实现**: ```sql WITH FirstOrderYear AS ( SELECT CustomerID, MIN(YEAR(OrderDate)) AS FirstOrderYear -- 计算每个客户的首次订购年份 FROM Orders GROUP BY CustomerID ) SELECT YEAR(o.OrderDate) AS OrderYear, CASE WHEN YEAR(o.OrderDate) = f.FirstOrderYear THEN '新客户' ELSE '老客户' END AS CustomerType, SUM(o.SalesAmount) AS TotalSales FROM Orders o LEFT JOIN FirstOrderYear f ON o.CustomerID = f.CustomerID GROUP BY YEAR(o.OrderDate), CustomerType ``` **说明**:通过窗口函`MIN()`计算首次购买年份,再与订单年份对比分类。 --- #### **2. Excel据处理与比计算** - **步骤**: 1. **导入据**:将SQL结果导入Excel,确保字段为`OrderYear`, `CustomerType`, `TotalSales`。 2. **透视表汇总**: - 行:`OrderYear` - 列:`CustomerType` - 值:`TotalSales`(求和) 3. **计算比例**: - 新增列`新客户比`,公式:`=新客户销售额/(新客户销售额+老客户销售额)` - 同理计算`老客户比` 4. **可视化**: - 使用**组合图**(柱形图+折线图),主坐标轴为销售额,次坐标轴为比[^2]。 --- #### **3. 关键分析点** - **趋势分析**:观察新客户比是否随年份增长而下降(可能反映客户留存问题)[^4]。 - **异常检测**:若某年老客户销售额突增,需排查据质量问题或营销动影响。 - **业务建议**:高老客户比的年份可总结复购策略,低比年份需优化新客转化[^4]。 --- ### 示例输出(Excel透视表) | 订购年份 | 新客户销售额 | 老客户销售额 | 新客户比 | 老客户比 | |----------|--------------|--------------|------------|------------| | 2021 | 150,000 | 350,000 | 30% | 70% | | 2022 | 200,000 | 500,000 | 28.6% | 71.4% | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羚风雯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值