首页 > 数据库 >SQL练习题之统计连续登录七天的用户(开窗实现)

SQL练习题之统计连续登录七天的用户(开窗实现)

时间:2024-11-11 10:44:09浏览次数:3  
标签:练习题 FORMAT sign DATE user SQL date id 开窗

4. (困难)统计连续登录七天(含七天)以上的用户(开窗和不开窗都要求实现)。

SQL文件:user_sign.sql

实现思路:

#对日期排序,并用denserank 开窗排序
#对排序编号或日期的天去重,排除一天登录两次的情况
#让日期与排序序号做差,如若连续,则差会相等
#分组计数相同的差值
#差值相等的大于等于7则表示连续登录七天
#合并为最终语句

#对每个用户的登录日期排序,并进行开窗denserank非跳步排序
SELECT
	user_id,
	sign_date,
	DENSE_RANK() OVER (
		PARTITION BY user_id 
	ORDER BY
	DATE_FORMAT( sign_date, '%y%m%d' )) AS rn 
FROM
	user_sign;

由user_sign表可知,user_id=1的用户在28号登录的两次,只能算一天的登录,则需要对其去重:

#去重-按日期
SELECT DISTINCT
	rn,
	user_id,
	DATE_FORMAT( sign_date, '%y-%m-%d' ) sign_date 
FROM
	(
 SELECT
 user_id,
 sign_date, 
 DENSE_RANK() 
 OVER ( PARTITION BY user_id ORDER BY DATE_FORMAT( sign_date, '%y%m%d' )) AS rn 
FROM user_sign
 ) t1

#如果连续则每一行的日期与ranknumber的差值相等
SELECT
	user_id,
	sign_date,
	DATE_FORMAT( date_sub( sign_date, INTERVAL rn DAY ), '%d' ) AS diff_date 
FROM
	(
	SELECT DISTINCT
		rn,
		user_id,
		DATE_FORMAT( sign_date, '%y-%m-%d' ) sign_date 
	FROM
		(
 SELECT
 user_id,
 sign_date, 
 DENSE_RANK()
 OVER ( PARTITION BY user_id ORDER BY DATE_FORMAT( sign_date, '%y%m%d' )) AS rn FROM user_sign 
) t1 
) t2;

#id进行分组,统计次数
select user_id,count(diff_date) from(
select 
	user_id,
	sign_date,
	DATE_FORMAT(date_sub(sign_date,INTERVAL rn  day),'%d') as diff_date
FROM
	(
	select 
 DISTINCT rn,
 user_id,
 DATE_FORMAT(sign_date,'%y-%m-%d') sign_date from 
(
select
 user_id,
 sign_date,
 DENSE_RANK()
 OVER(PARTITION by user_id ORDER BY DATE_FORMAT(sign_date,'%y%m%d'))as rn from user_sign
) t1
) t2
) t3
GROUP BY user_id,diff_date;

#差值相等的大于等于7则表示连续登录七天
#合并为最终语句
with cds as(
select 
 user_id,
 count(diff_date) total 
from(
select 
	user_id,
	sign_date,
	DATE_FORMAT(date_sub(sign_date,INTERVAL rn  day),'%d') as diff_date
FROM
	(
 select 
 DISTINCT rn,
 user_id,
 DATE_FORMAT(sign_date,'%y-%m-%d') sign_date from 
(
 select
 user_id,
 sign_date,DENSE_RANK()
 OVER(PARTITION by user_id ORDER BY 
 DATE_FORMAT(sign_date,'%y%m%d'))as rn from user_sign
) t1
) t2
) t3
GROUP BY user_id,diff_date)
select user_id from cds where total>=7;

标签:练习题,FORMAT,sign,DATE,user,SQL,date,id,开窗
From: https://blog.csdn.net/qq_64407249/article/details/143674928

相关文章

  • 因为mysql 8新的认证插件导致主从复制的IO线程失败
    1、错误信息Last_IO_Error:errorconnectingtomaster'[email protected]:3306'-retry-time:60retries:1message:Authenticationplugin'caching_sha2_password'reportederror:Authenticationrequiressecureconnection.2、在主库检查复制用户的pl......
  • bp靶场之SQL注入
    靶场链接https://portswigger.net/web-security/all-labssql注入payload速查表https://portswigger.net/web-security/sql-injection/cheat-sheetSQL注入WHERE子句中的SQL注入漏洞允许检索隐藏数据进入lab,点击类别xia_sql显示√,说明有可能有sql注入直接往参数后拼'o......
  • 如何运用SQL SERVER制作投诉应急管理系统
       制作一个投诉应急管理系统,SQLServer数据库可以发挥关键作用。以下是一个基于SQLServer的投诉应急管理系统的大致设计思路:    一、系统需求分析    投诉应急管理系统旨在快速、有效地处理用户投诉,提高客户满意度。系统需要具备以下功能:    1.......
  • mysql清理binlog日志的方法
    MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉一部分没用的日志。 [方法一]手动清理binlog清理前的准备:1.查看主库和从库正在使用的binlog是哪个文件......
  • PostgreSQL configure: error: readline library not found
    前言安装PostgreSQL时报错,以下复制代码configure:error:readlinelibrarynotfoundIfyouhavereadlinealreadyinstalled,seeconfig.logfordetailsonthefailure.Itispossiblethecompilerisn'tlookingintheproperdirectory.Use--without-readline......
  • MySQL第四章,SQL高级二子查询
    子查询的定义子查询(Subquery)是嵌套在其他SQL语句中的查询,也称为内查询(InnerQuery)或嵌套查询(NestedQuery)。子查询可以放在SELECT、INSERT、UPDATE、DELETE等语句中,并且支持多层嵌套,即子查询中还可以包含其他子查询。子查询的作用子查询的主要作用包括:结构化查询:子查询允许......
  • 基于Python电影票房数据分析可视化系统 Flask框架 豆瓣电影票房 MySQL数据库 大数据毕
    博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌>......
  • [GXYCTF2019]BabySQli
    题目链接:[GXYCTF2019]BabySQli。个人认为这道题是脑洞题(当然也跟基础业务知识不够有关)。打开题目后环境如下。只有一个登录框,因此常规操作,先测试一下看看。通过多次输入不同的UserName、password发现,存在admin用户,并且可以遍历UserName。接下来尝试注入,发现似乎只有......
  • SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略
    SQL注入攻击及其在SpringBoot中使用MyBatisPlus的防范策略随着互联网技术的飞速发展,Web应用的安全问题日益凸显,其中SQL注入攻击是最常见的安全威胁之一。SQL注入攻击不仅可能导致敏感数据泄露,还可能引发数据篡改、服务中断等严重后果。本文将详细介绍SQL注入攻击的基本概念......
  • win10安装与配置Mysql9.1时执行net start mysql显示服务名无效请输入NET HELPMSG 2185
    几年的时间mysql从5.0到9.x了,在windows系统上安装两种方式,MSI安装程序和ZIP压缩包。这里不讲安装教程,只说说安装报错的原因。最近用zip压缩包下载解压配置,下载社区版本,在官网下载对应的版本。https://downloads.mysql.com/archives/community/在前面修改my.ini文件,以及执行......