1141-查询近30天活跃用户数

查询近30天活跃用户数

原文地址:1141. 查询近30天活跃用户数 - 力扣(LeetCode)

  • 题目如下所示

个人题解

这题主要考察 MySQL 中 DATE 数据类型的操作和 GROUP BY 用法。个人思考过程如下所示

  • -- 1. 建表
    CREATE TABLE 1141_Activity(
    user_id INT,
    session_id INT,
    activity_date DATE,
    activity_type ENUM('open_session', 'end_session', 'scroll_down', 'send_message')
    );
    -- 2. 编写 SQL 查询 截至 2019-07-27(包含),近 30 天的每日活跃用户数量(当天只要有一条活动记录,即为活跃用户)
    -- 1)查询 近30 天的用户(使用 DATEDIFF 函数)
    SELECT * FROM 1141_Activity ac WHERE DATEDIFF('2019-07-27', ac.activity_date) <= 30
    -- 2) 查询每日活跃用户数量
    SELECT ac.activity_date day, COUNT( DISTINCT ac.user_id ) active_users FROM 1141_Activity ac WHERE DATEDIFF('2019-07-27', ac.activity_date) <= 30 GROUP BY ac.activity_date HAVING COUNT(ac.session_id) >= 1;
    -- 看上去没错,实际上还是错了,暂时没找到原因
    -- 第一步,这个 DISTINCT 用法有没有问题?
    -- 没问题
    -- 第二部,这个 DATEDIFF 有没有问题?
    -- diff 这里还需要做一个 大于 0 的判断,不然负数也是小于 30 的(PS:题目有点怪怪的,说了包含但是却不能等于 30)
    SELECT ac.activity_date day, COUNT( DISTINCT ac.user_id ) active_users FROM 1141_Activity ac WHERE DATEDIFF('2019-07-27', ac.activity_date) < 30 AND DATEDIFF('2019-07-27', ac.activity_date) > 0 GROUP BY ac.activity_date HAVING COUNT(ac.session_id) >= 1;
    -- where 过滤
    SELECT ac.activity_date day, COUNT( DISTINCT ac.user_id ) active_users FROM 1141_Activity ac WHERE DATEDIFF('2019-07-27', ac.activity_date) < 30 AND DATEDIFF('2019-07-27', ac.activity_date) > 0 GROUP BY ac.activity_date HAVING COUNT(ac.session_id) >= 1;
    -- having 过滤
    SELECT ac.activity_date day, COUNT( DISTINCT ac.user_id ) active_users FROM 1141_Activity ac GROUP BY ac.activity_date HAVING DATEDIFF('2019-07-27', ac.activity_date) <30 and DATEDIFF('2019-07-27', ac.activity_date) > 0 AND COUNT(ac.session_id) >= 1;
    -- 我个人认为 having 过滤较为高效一些,因为这样子 DATEDIFF 函数就少判断了很多次
    -- 官网上的题解 基本都是 不带我后面这个 COUNT(ac.session_id) >= 1 的判断的,因为 既然在 Activity 表中,则说明 COUNT(ac.session_id) 会永远大于等于 1
    -- 同时 时间过滤还可以用 between and 稍微简化一下下,如下所示
    SELECT ac.activity_date day, COUNT( DISTINCT ac.user_id ) active_users FROM 1141_Activity ac GROUP BY ac.activity_date HAVING DATEDIFF('2019-07-27', ac.activity_date) BETWEEN 0 and 29;
posted @   OnlyOnYourself-Lzw  阅读(110)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2022-07-11 05-Nacos注册中心
2022-07-11 04-Ribbon负载均衡
2022-07-11 03-Eureka注册中心
2022-07-11 02-服务拆分和远程调用
2022-07-11 01-微服务的概念
点击右上角即可分享
微信分享提示