MySQL8.0之前实现row_number以及计算玩家连续登录天数

news/2024/11/24 1:59:52/

使用MySQL 5.7版本统计 玩家连续登录天数

原始数据
在这里插入图片描述

玩家同一天多次登录只保留一条

select DISTINCT(FROM_UNIXTIME(login_time,'%Y-%m-%d')) as login_date,rid from t_log_login order by rid; 

在这里插入图片描述

借助两个变量统计每个玩家登录日期对应的次数

SELECT
*
FROM(SELECT DISTINCT FROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,rid FROM t_log_login ) AS a,
(select @last_rid := '',@rn:=0) as b order by rid,login_date;

在这里插入图片描述
原始表多了两个表量,一个记录 当前循环的rid,一个记录rid出现的次数。
目前两个值都为初始值,现在对其进行调整

SELECTa.login_date,CASE
WHEN rid = @last_rid THEN@rn := @rn + 1
ELSE@rn := 1
END AS rnn,@last_rid := rid AS rid
FROM(SELECT DISTINCTFROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,ridFROMt_log_login) AS a,(SELECT @last_rid := '' ,@rn := 0) AS b
ORDER BYrid,login_date;

我们只关注select 和from之前的字段部分,大概意思就是,如果rid等于设置的变量@last_rid ,rid对应的次数就加1,否则就等于1,然后再把rid的值赋值给 @last_rid 。可能这里不太懂,我们一步一步来看。

在这里插入图片描述
因此这里就体现了排序的重要性了。rid相同的必须连接在一起。

最终结果是:
在这里插入图片描述

使用日期函数date_add处理数据

上面的数据只能显示了每个玩家,某天对应的连续登录的第n次,中间断开的没有。比如

riddatern
123456782022-10-121
123456782022-10-132
123456782022-10-143
123456782022-10-164

那只能说rid=12345678 连续登录了3天。

那这种思路是什么呢,我们用当天日期减去对应的第n天,在这个列表里面也就是,2022-10-12 减去 1 天,也就是 2022-10-11 , 2022-10-13 号减去两天也是 2022-10-11 , 依次类推,因为 rn是顺序加1的,因此只要保证 日期也是顺序 加 1 的,就能说用户是连续登录了的。

因此思路:看 date - rn 对应日期 出现 的次数 就是 连续登录的天数了。就用group by就行了。

最终SQL:

select rid,count(*) as login_counts from(SELECTa.login_date,CASE
WHEN rid = @last_rid THEN@rn := @rn + 1
ELSE@rn := 1
END AS rnn,@last_rid := rid AS rid
FROM(SELECT DISTINCTFROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,ridFROMt_log_login) AS a,(SELECT @last_rid := '' ,@rn := 0) AS b
ORDER BYrid,login_date
)as  d  group by rid,date_add(d.login_date,interval -@rn day) ;

在这里插入图片描述

思考

以上的sql可能出现表述不清楚的问题,如果是这种情况

riddatern
123456782022-10-121
123456782022-10-132
123456782022-10-143
123456782022-10-164
123456782022-10-175

那么 12345678 就会出现两行,因此要加上一个开始时间从哪天开始连续登录的。

select rid,  
date_add(d.login_date,interval -@rn day) as login_start_before,
count(*) as login_counts from(SELECTa.login_date,CASE
WHEN rid = @last_rid THEN@rn := @rn + 1
ELSE@rn := 1
END AS rnn,@last_rid := rid AS rid
FROM(SELECT DISTINCTFROM_UNIXTIME(login_time, '%Y-%m-%d') AS login_date,ridFROMt_log_login) AS a,(SELECT @last_rid := '' ,@rn := 0) AS b
ORDER BYrid,login_date
)as  d  group by rid,login_start_before ;

注意这里 开始时间需要在加上 一天,因为我们算的 日期 - 第n次出现,得到的是首次登录的前一天。这里就自己在外层加个日期转换就行了哦。


http://www.ppmy.cn/news/23626.html

相关文章

【代码随想录二刷】Day9-字符串-C++

代码随想录二刷Day9 今日任务 28.找出字符串中第一个匹配项的下标 459.重复的子字符串 字符串总结 双指针总结 语言:C KMP 链接:https://programmercarl.com/0459.重复的子字符串.html#kmp 用处:当出现字符串不匹配时,可以利…

差分模拟信号转单端输出电路设计

需求分析: 1.差分输入0~16V -Vpp电压量; 2.输入频率0~1.2KHz; 3.单端对应输出0~3V的模拟量; 4.输出频率对应0~1.2KHz; 5.供电范围3~5V。 针对以上需求,设计如下图所示电路。 1.电路功能: …

nvidia设置wifi和接口

tx-nx设置wifi和接口前言基础知识点1.创建和删除一个wifi连接2. 启动连接和关闭连接代码和调试1. 代码展示2. 调试写到最后前言 针对嵌入式开发,有时候通过QT或PAD跨网络对设备设置WIFI,在此记录下,方便后续的查阅。 基础知识点 1.创建和删…

167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < index1 < index2 < numbers…

webpack新手入门

前言&#xff1a; 如何配置webpack呢&#xff1f; webpack概念有哪些呢&#xff1f; 怎么快速理解并使用webpack呢&#xff1f; 文章目录一. 什么是webpack二. 安装webpack三. webpack的五个核心概念四. webpack配置五. loader加载器1. css处理2. 处理文件&#xff08;图片&…

Python traceback模块:获取异常信息

除了使用 sys.exc_info() 方法获取更多的异常信息之外&#xff0c;还可以使用 traceback 模块&#xff0c;该模块可以用来查看异常的传播轨迹&#xff0c;追踪异常触发的源头。下面示例显示了如何显示异常传播轨迹&#xff1a;classSelfException(Exception): pass defmain(): …

YOLO-V1~V3经典物体检测算法介绍

大名鼎鼎的YOLO物体检测算法如今已经出现了V8版本&#xff0c;我们先来了解一下它前几代版本都做了什么吧。本篇文章介绍v1-v3&#xff0c;后续会继续更新。一、节深度学习经典检测方法概述1.1 检测任务中阶段的意义我们所学的深度学习经典检测方法 &#xff0c;有些是单阶段的…

Fluid-数据编排能力原理解析

前言本文对Fluid基础功能-数据编排能力进行原理解析。其中涉及到Fluid架构和k8s csi driver相关知识。建议先了解相关概念&#xff0c;为了便于理解&#xff0c;本文使用JuiceFS作为后端runtime引擎。原理概述Fuild数据编排能力&#xff0c;主要是在云原生环境中&#xff0c;能…