力扣1107 每日新用户统计

news2024/9/21 0:38:53

力扣SQL查询案例——在过去90天内,每个日期首次登录的用户数

目录

题目描述

解题思路

完整代码


题目描述

Traffic 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| activity      | enum    |
| activity_date | date    |
+---------------+---------+
该表可能有重复的行。
activity 列是 ENUM 类型,可能取 ('login', 'logout', 'jobs', 'groups', 'homepage') 几个值之一。

编写解决方案,找出从今天起最多 90 天内,每个日期该日期首次登录的用户数。假设今天是 2019-06-30 

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入:
Traffic 表:
+---------+----------+---------------+
| user_id | activity | activity_date |
+---------+----------+---------------+
| 1       | login    | 2019-05-01    |
| 1       | homepage | 2019-05-01    |
| 1       | logout   | 2019-05-01    |
| 2       | login    | 2019-06-21    |
| 2       | logout   | 2019-06-21    |
| 3       | login    | 2019-01-01    |
| 3       | jobs     | 2019-01-01    |
| 3       | logout   | 2019-01-01    |
| 4       | login    | 2019-06-21    |
| 4       | groups   | 2019-06-21    |
| 4       | logout   | 2019-06-21    |
| 5       | login    | 2019-03-01    |
| 5       | logout   | 2019-03-01    |
| 5       | login    | 2019-06-21    |
| 5       | logout   | 2019-06-21    |
+---------+----------+---------------+
输出:
+------------+-------------+
| login_date | user_count  |
+------------+-------------+
| 2019-05-01 | 1           |
| 2019-06-21 | 2           |
+------------+-------------+
解释:
请注意,我们只关心用户数非零的日期.
ID 为 5 的用户第一次登陆于 2019-03-01,因此他不算在 2019-06-21 的的统计内。

解题思路

要解决这个问题,我们需要找出在过去90天内,每个日期首次登录的用户数。解题思路如下:

  1. 筛选登录活动:首先,我们需要从Traffic表中筛选出所有login活动的记录。

  2. 确定每个用户的首次登录日期:接下来,对于每个用户,我们需要找到他们的首次登录日期。这可以通过对每个用户的登录记录按日期排序,然后选择最早的一条记录来实现。

  3. 限定时间范围:由于我们只关心过去90天内的数据,因此需要从今天(2019-06-30)往回数90天,即2019-04-01起的数据。

  4. 计算每个日期的首次登录用户数:最后,我们需要按照首次登录日期对用户进行分组,并计算每个组的用户数。

完整代码

WITH FirstLogin AS (
    SELECT user_id, MIN(activity_date) AS first_login_date
    FROM Traffic
    WHERE activity = 'login'
    GROUP BY user_id
    HAVING first_login_date BETWEEN DATE_SUB('2019-06-30', INTERVAL 90 DAY) AND '2019-06-30'
)

SELECT first_login_date AS login_date, COUNT(user_id) AS user_count
FROM FirstLogin
GROUP BY first_login_date
ORDER BY first_login_date;
  • FirstLogin子查询:这个CTE(公用表表达式)首先筛选出所有login活动的记录,然后对每个user_idactivity_date进行分组并使用MIN(activity_date)来找到每个用户的首次登录日期。HAVING子句确保我们只考虑过去90天内的首次登录。

  • 最终的SELECT语句:从FirstLogin中选择first_login_date和对应的user_id数量(作为user_count),并按first_login_date进行分组,以计算每个日期的首次登录用户数。结果按first_login_date排序,以符合题目要求的任意顺序。

通过

代码优化

贴近业务,刷题考虑这些比较少了,先掌握再提升

  1. 索引使用:确保Traffic表中的user_idactivityactivity_date列上有适当的索引。特别是,对于此查询,一个覆盖索引(activity, activity_date, user_id)可能会非常有用,因为它可以加速login活动的筛选和按日期的最小值查找。

  2. 减少数据扫描量:在WHERE子句中通过指定activity = 'login'来缩小查询范围,这样可以减少需要处理的数据量。此外,通过在HAVING子句中进一步限制日期范围,只考虑过去90天内的数据,也有助于减少计算量。

  3. 使用更有效的日期计算:如果数据库支持,使用数据库特定的日期函数来计算90天前的日期,可能比硬编码更有效,也更易于维护。例如,MySQL中可以使用DATE_SUB(NOW(), INTERVAL 90 DAY)来动态计算过去90天的日期,这样查询就不会因为固定日期而过时。

  4. 分析执行计划:运行查询的执行计划,查看是否有可能的性能瓶颈。数据库的执行计划可以帮助你了解查询是如何执行的,包括使用的索引、数据扫描量和各个操作的成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1480488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机二级MySQL-错题、知识点合集04

计算机二级MySQL 第四章 索引 主键约束,不允许为空也不允许重复。 NOT NULL非空约束属于自定义完整约束 PRIMARY KEY 属于实体完整性约束 FOREIGN KEY外键约束 外键与其引用的主键应分别属于不同的表,可以属于同一个关系;一个关系中可以定…

如何在Window系统部署BUG管理软件并结合内网穿透实现远程管理本地BUG

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

css5定位

css 一.定位1.概念(定位定位模式边位移)2.静态位移static(不常用)3.相对定位relative(不脱标)(占位置)4.绝对定位absolute(脱标)(不占位置&#x…

Unity(第十七部)Unity自带的角色控制器

组件Character Controller 中文角色控制器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class player : MonoBehaviour {private CharacterController player;void Start(){player GetComponent<CharacterController>();}v…

leetcode刷题(javaScript)——栈相关场景题总结

在LeetCode刷题中&#xff0c;栈是一个非常有用的数据结构&#xff0c;可以解决许多问题&#xff0c;包括但不限于以下几类问题&#xff1a; 括号匹配问题&#xff1a;例如检查括号序列是否有效、计算表达式的值等。逆波兰表达式求值&#xff1a;使用栈来实现逆波兰表达式的计算…

Linux线程【1概念】

目录 前言&#xff1a; 正文&#xff1a; 1.什么是线程&#xff1f; 1.1基本概念 1.2线程理解 1.3进程与线程的关系 1.4线程使用 2.重谈地址空间 2.1页表的大小 2.2、内存与磁盘的交互 2.3深入页表 2.4小结 3.线程概念总结 3.1、再谈线程 3.2线程的优点 3.3…

MYSQL 解释器小记

解释器的结果通常通过上述表格展示&#xff1a; 1. select_type 表示查询的类型 simple: 表示简单的选择查询&#xff0c;没有子查询或连接操作 primary:表示主查询&#xff0c;通常是最外层的查询 subquery :表示子查询&#xff0c;在主查询中嵌套的查询 derived: 表示派…

pip降级在pycharm中

PyCharm依赖于"–build-dir"参数安装第三方库&#xff0c;但该参数在最新的23.0版pip中已删除 解决办法就是降级pip&#xff0c;PyCharm中选择File&#xff0c;找到编译器&#xff0c;点击pip&#xff0c;勾选对应版本即可 或者在cmd中执行运行python -m pip install…

android开发软件下载,2024年Android开发陷入饱和

谈起性能优化&#xff0c;我想问&#xff0c; 什么是性能优化&#xff1f;你的理解呢&#xff1f; **首先什么是性能&#xff1a;**在同一个手机里面&#xff0c;同样功能的app&#xff0c;哪个跑的快&#xff0c;哪个不卡&#xff0c;哪个就性能高。我们这篇文章就是解决那些…

SQL注入漏洞解析--less-6

1.第六关了。 2.这个和第五关有点像&#xff0c;只是换成了双引号&#xff0c;接下来的都一样&#xff0c;看我操作(换个函数试一下extractvalue&#xff0c;他的报错位置在第二个&#xff0c;那我就利用一下) 3.爆库名 ?id1"%20and%20extractvalue(1,concat(0x7e,(sele…

后地产时代,卫浴品牌有何变革之道?

联系与卫浴密切相关的房地产行业现状来看&#xff0c;卫浴行业正处于变革期。 国家统计局数据显示&#xff0c;2023年&#xff0c;商品房销售面积111735万平方米&#xff0c;比上年下降8.5%&#xff0c;其中住宅销售面积下降8.2%&#xff1b;商品房销售额116622亿元&#xff0…

低功耗微处理器复位检测电路,工作温度范围-40~+80℃,可与μP监控产品兼容——D706

近年来&#xff0c;微处理器在IT业控制领域和智能化产品中得到了广泛的应用。在系统和产品的开发设计过程中&#xff0c;为了提高其抗干扰能力&#xff0c;使用μP监控是首选技术措施之一。监控芯片可为系统提供上电、掉电复位功能&#xff0c;也可提供其它功能&#xff0c;如后…

二分通用模板+例题java

&#x1f9e1;&#x1f9e1;二分大前提&#x1f9e1;&#x1f9e1; 有序数列&#xff01;&#xff01; &#x1f9e1;&#x1f9e1;模板&#x1f9e1;&#x1f9e1; 查找具体某个元素 while(left<right) &#xff1a;三个分支&#xff0c;在循环里直接返回答案 //二分查找具…

JSON 文件里的 “$schema” 是干什么用的?

最近我在做一些前端项目&#xff0c;我发现有的配置文件&#xff0c;比如 .prettierrc.json 或者 tsconfig.json 里面都会看到一个 $schema 字段&#xff0c;有点好奇&#xff0c;就查了一下。 什么是 JSON Schema JSON Schema是一种基于JSON (JavaScript Object Notation) 的…

电梯物联网之梯控相机方案-防止电瓶车进电梯

梯控现状 随着电梯产品在智能化建筑的日益普及,对于电梯的智能化管理 安全性需求 的要求越来越迫切。尤其今年来随着电瓶车的大量普及&#xff0c;发起多起楼道、轿厢电瓶车着火恶性事件&#xff0c; 造成了极大的社会 负面影响。控制电瓶车进入单元门&#xff0c;楼道以及电梯…

浅析智能照明控制系统在图书馆照明节能中的应用

彭姝麟 Acrelpsl 0 引 言 照明耗电在各国总发电量中都占有很大比例&#xff0c;根据2004年国家住房和城乡建设部的统计&#xff0c; 我国照明耗电约占全国发电总量的10&#xff05;一12&#xff05;。 对一些照明时间较长、照明场所较多的机构&#xff0c;如高等学校&#xf…

百度新版VMP

百度搞事情哇最近&#xff0c;新上验证类型&#xff0c;曲线匹配&#xff01;&#xff01;&#xff01; 这年头儿&#xff0c;连百度都还是上vmp了兄弟们&#xff0c;越来越难咯。 个人感觉 想学好vm的话&#xff0c;首先得找个好位置插装&#xff0c;然后慢慢分析。 轨迹信息…

Spring注解之json 数据处理

目录 1. 过滤 json 数据 2. 格式化 json 数据 3. 扁平化对象 1. 过滤 json 数据 JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。 //生成json时将userRoles属性过滤 JsonIgnoreProperties({"userRoles"}) public class User { ​private S…

C++的继承和多态

继承和多态 继承继承的权限继承的子父类访问派生类的默认成员函数菱形继承&#xff08;C独有&#xff09;【了解】虚拟继承什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;什么是菱形虚拟继承&#xff1f;如何解决数据冗余和二义性的继承和组合的区别&#xff1f;…

Redis冲冲冲——事务支持,AOF和RDB持久化

目录 引出Redis事务支持&#xff0c;AOF和RDB持久化1、Redis的事务支持2、Redis的持久化 Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——事务支持&#xff0c;AOF和RDB持久化 Redis事务支持&#xff0c;AOF和…