SQL练习七—留存率问题

目录

一 如何计算留存率

1.先把想要的数据提取出来观察:用户id、日期、次日日期

2.留存情况:我们希望当前日期和次日日期对应起来

3.留存率计算:留存的(有次日信息)/全部 

4.整理思路,代码优化

 二 留存率实战练习—2021年11月每天新用户的次日留存率

一 如何计算留存率
  • 公式:留存率 = (留存用户数 / 初始用户数)× 100%。
  • 举例:假设一个应用在第一天有 1000 个新用户注册,到第 7 天时,这 1000 个用户中有 300 个仍然在使用该应用,那么第 7 天的留存率 = (300 / 1000)× 100% = 30%。

问题分析:

1.先把想要的数据提取出来观察:用户id、日期、次日日期

去重:去掉一个用户一日多次登录记录

select distinct device_id,date,date_add(date,interval 1 day)as ciri
from question_practice_detail
order by device_id,date

2.留存情况:我们希望当前日期和次日日期对应起来

如果没有就是次日没来,如果有就代表次日留存

with t1 as(
select distinct device_id,date,date_add(date,interval 1 day)as ciri
from question_practice_detail
order by device_id,date
)
select a.device_id,a.date as '登录日期',b.date as '次日日期' from  t1 as a
left join t1 as b
on a.device_id=b.device_id and a.date+1=b.date

3.留存率计算:留存的(有次日信息)/全部 

  count(次日)/count(device_id)

4.整理思路,代码优化
select round(count(yd)/count(device_id),4) as avg_ret
from(
select distinct q1.device_id as device_id,q1.date as td ,q2.date as yd
from question_practice_detail as q1
left join  question_practice_detail  as q2
on q1.device_id=q2.device_id and q2.date=date_add(q1.date,interval 1 day)
    ) a

 二 留存率实战练习—2021年11月每天新用户的次日留存率

t1:用户,注册日期(最小的登录日期),按日期group 计每日新增用户数 

t2:(用户的登录信息) 用户,登录时间(进出跨天两天都计入)

把这个注册信息和登录信息连接on用户id和日期(检查次日是否登录 注册日期+1=登录日期)

select
    regdt,
    round(count(t3.uid) / count(t2.uid), 2) as uv_left_rate
from
    (
        select
            uid,
            regdt,
            count(uid) over (
                partition by
                    regdt
            ) as uv
        from
            (
                select
                    uid,
                    date (min(in_time)) as regdt
                from
                    tb_user_log
                group by
                    uid
            ) t1
    ) t2
    left join (
        select
            uid,
            date (in_time) as dt
        from
            tb_user_log
        union
        select
            uid,
            date (out_time) as dt
        from
            tb_user_log
    ) t3 on t3.dt = date_add (regdt, interval 1 day)
    and t2.uid = t3.uid
where
    date_format (regdt, '%Y-%m') = '2021-11'
group by
    regdt

<think>好的,用户想了解工作中常用的SQL练习。首先,我需要确定用户的需求。他们可能刚开始学习SQL,或者想在工作中提升自己的查询能力。需要介绍常见的练习内容,确保覆盖实际工作场景中的常见操作。 用户可能对哪些方面感兴趣呢?基础操作肯定是必须的,比如SELECT、WHERE、JOIN这些。然后是分组聚合,因为数据分析中经常用到GROUP BY和聚合函数。子查询和CTE也是高级查询中常用的,应该包括进去。 窗口函数在数据处理中很重要,尤其是在排名和分区计算时,用户可能需要这方面的练习。表操作如创建、修改表结构,还有插入更新数据,这些也是日常维护的一部分。优化部分,比如索引和执行计划,能帮助用户提高查询效率,但可能对初学者稍难,不过还是有必要提一下。 实际应用场景的例子会更具体,比如销售数据或用户行为分析,这样用户可以更直观地理解如何应用SQL练习题的设计需要由浅入深,从简单查询到复杂分析,逐步提升难度。同时,推荐学习资源可以帮助用户自主学习,比如LeetCode、牛客网这些平台。 需要确保语言简洁明了,避免使用专业术语过多,让初学者也能理解。结构上分点列出,每个部分用小标题和代码示例,这样用户看起来清晰。可能用户没有提到的深层需求是希望直接应用到工作中,所以实际例子和练习题特别重要,能帮助他们巩固知识。 最后检查是否有遗漏的部分,比如常见的日期处理、字符串函数,这些在练习中也经常遇到,应该包含进去。还有性能优化部分,虽然进阶但很实用。确认内容全面,覆盖了大多数工作场景,这样用户能得到实用的指导。</think>在工作中进行 SQL 练习时,建议重点关注以下实用场景和常见操作,这些内容能帮助你应对实际工作中的数据处理需求: --- ### **1. 基础查询与过滤** - **SELECT + WHERE** ```sql -- 查询特定条件下的数据(如时间范围、状态) SELECT order_id, customer_name, order_date FROM orders WHERE order_date >= '2023-01-01' AND status = 'completed'; ``` - **DISTINCT 去重** ```sql -- 获取唯一值列表 SELECT DISTINCT department FROM employees; ``` --- ### **2. 分组聚合与统计** - **GROUP BY + 聚合函数** ```sql -- 按部门统计平均工资 SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department; ``` - **HAVING 过滤分组结果** ```sql -- 筛选出销售额超过 1 万的部门 SELECT department, SUM(sales) AS total_sales FROM sales_data GROUP BY department HAVING SUM(sales) > 10000; ``` --- ### **3. 多表关联与连接** - **JOIN 操作(INNER/LEFT/RIGHT JOIN)** ```sql -- 关联订单表和客户表 SELECT o.order_id, c.customer_name, o.amount FROM orders o LEFT JOIN customers c ON o.customer_id = c.id; ``` - **自关联查询(如层级数据)** ```sql -- 查询员工及其经理 SELECT e.name AS employee, m.name AS manager FROM employees e LEFT JOIN employees m ON e.manager_id = m.id; ``` --- ### **4. 子查询与 CTE** - **子查询嵌套** ```sql -- 查询工资高于部门平均工资的员工 SELECT name, salary, department FROM employees WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.department = e1.department); ``` - **CTE(公共表表达式)** ```sql WITH dept_avg AS ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) SELECT e.name, e.salary, d.avg_salary FROM employees e JOIN dept_avg d ON e.department = d.department; ``` --- ### **5. 窗口函数(高级分析)** - **排名(ROW_NUMBER/RANK/DENSE_RANK)** ```sql -- 按销售额给销售员排名 SELECT salesperson, sales, RANK() OVER (ORDER BY sales DESC) AS rank FROM sales; ``` - **累计计算(SUM OVER)** ```sql -- 计算月度销售额累计 SELECT month, sales, SUM(sales) OVER (ORDER BY month) AS cumulative_sales FROM monthly_sales; ``` --- ### **6. 日期与字符串处理** - **日期格式化与计算** ```sql -- 计算订单处理时长(天数) SELECT order_id, DATEDIFF(day, order_date, shipped_date) AS processing_days FROM orders; ``` - **字符串截取与拼接** ```sql -- 合并姓和名 SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; ``` --- ### **7. 数据更新与表操作** - **INSERT/UPDATE/DELETE** ```sql -- 更新用户状态 UPDATE users SET status = 'inactive' WHERE last_login < '2022-01-01'; ``` - **表结构修改(ALTER TABLE)** ```sql -- 添加新列 ALTER TABLE products ADD COLUMN category VARCHAR(50); ``` --- ### **8. 性能优化技巧** - **索引的使用场景** ```sql -- 为高频查询字段创建索引 CREATE INDEX idx_customer_id ON orders (customer_id); ``` - **EXPLAIN 分析执行计划** ```sql EXPLAIN SELECT * FROM orders WHERE customer_id = 1001; ``` --- ### **实际场景练习建议** 1. **模拟业务数据**(如电商、金融、用户行为数据) - 分析用户留存率、销售额趋势、产品库存状态等。 2. **LeetCode/牛客网** - 刷题平台提供真实面试题(如「第二高的薪水」「连续登录用户」)。 3. **Kaggle 公开数据集** - 用真实数据集练习复杂分析(如 COVID 数据、电影评分)。 --- 通过以上练习,你可以快速掌握工作中高频使用的 SQL 技能,应对数据查询、报表生成、业务分析等实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值