开窗排序函数除了在处理简单的排序问题外,它的应用场景远比我们想的要多。本文将对两个问题,介绍开窗排序函数的用法。

一、问题

有一张用户签到表【签到表】,标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字段:日期【a_date】,用户id【a_id】,是否签到【fis_sign_in】。

问题1:用户最近一次连续签到的天数?
输出表:用户id【a_id】,用户连续签到天数【最近连续签到天数】

问题2:用户最大连续签到天数?

输出表:用户id【a_id】,用户最大连续签到天数【最大连续签到天数】

二、数据集的理解:连续签到问题的数据集分为两种

1、只包含用户签到的日期,用户没有签到的数据不做记录;

2、包含所有工作日的记录,其中有设置字段来记录用户是否签到(例如字段fis_sign _in,0为未签到,1为已签到)。

但第二种数据集的处理很简单,只要在第一种的基础上筛选掉 fis_sign_in=0 就可以了。

二、思路

如果是连续的几天,那么它们日期分别减去排序后的值是相同的,注意这里的排序是连续的。

假设日期为a,a+1,a+2,排名为1,2,3,那么日期分别减去排序的值都为a-1;

假设日期为b,b+2,b+3,排名为,1,2,3,那么日期分别减去排序的值为b-1,b。

但要注意的是!如果数据集含有不同月份的数据,日期不能只是简单的减去排序,因为如果把月份看作数值,那么不同月份之间的数值并不是连续的,比‘2020-03-31’和‘2020-04-01’在数值上就不是连续的,那么在减去连续的排序后,它们的值是不相等的,因此不会把他们归为同一类。

如图前两行:

因此我们要做一个处理,让处理后的rankk还是以日期的形式保留。我们可以在日期列上减去“排序”个天数,这样返回的rankk列就是以日期形式保留了。

date_add(日期, interval -排序 day)
date_add(a_date,interval-(row_number() over (partition by a_id order by a_date))day)

连续签到天数的代码:

分组前:
select a_id,a_date,
date_add(a_date,interval-(row_number() over (partition by a_id order by a_date))day)
as rankk
from 签到表;分组后:
create view 连续签到表 as
select a_id,max(a_date)as 最后一次签到日期,count(*)as 连续签到天数 from
(select a_id,a_date,
date_add(a_date,interval-(row_number() over (partition by a_id order by a_date))day)
as rankk
from 签到表) as s1
group by a_id,rankk

签到表
分组后:连续签到表

三、答案

问题1:用户最近一次连续签到的天数?/用户截止今天的连续签到天数?
输出:用户id【id】,用户连续签到天数【最近连续签到天数】

在连续签到基础上,利用关联子查询,找出各用户最后一次签到日期的最大值即可。

select a_id,连续签到天数 as 最近连续签到天数
from 连续签到表 as s1
where 最后一次签到日期>=ALL
(select 最后一次签到日期 from 连续签到表 as s2
where s1.a_id=s2.a_id
group by a_id)

问题2:用户最大连续签到天数?

输出表:用户id【id】,用户最大连续签到天数【最大连续签到天数】

在连续签到基础上,取出max(连续签到天数)

select a_id,max(连续签到天数) as 最大连续签到天数
from 连续签到表
group by a_id;

如果数据集属于第二种数据集,只需在建立连续签到表处添加where fis_sign_in=1即可。

create view 连续签到表 as
select a_id,max(a_date)as 最后一次签到日期,count(*)as 连续签到天数 from
(select a_id,a_date,
date_add(a_date,interval-(row_number() over (partition by a_id order by a_date))day)
as rankk
from 签到表
where fis_sign_in=1) as s1
group by a_id,rankk

简单的签到代码_开窗排序函数解决连续签到问题|SQL相关推荐

  1. 简单的签到代码_签到功能,用 MySQL 还是 Redis ?

    现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动. 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常用的 ...

  2. 简单的签到代码_太神了吧!打开浏览器的一瞬就自动签到,经验积分礼物全到手...

    好的生活,不难也不贵 在大家在过年的这段时间里,很多小伙伴天天闲着在家无聊,于是每天都去什么网易云音乐.B 站直播.张大妈等打卡签个到.话说签到真是个好东西--只要小手一点,不仅可以获得经验提升等级, ...

  3. python测验5 函数和代码_测验5: 函数和代码复用 (第5周)-单选题

    1.以下选项不是函数作用的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬ A. 提 ...

  4. python实现app自动签到器_利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  5. 用python写一个手机app签到脚本_利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  6. 简单的签到代码_【SAS小恩的代码段】02样本分布、两群体与组合差异性检定

    为了响应停课不停学, 本人在吉林大学的课程教学上会大量使用SAS编程教学.同时本人撰写了两本SAS相关的教材,因此将会录制一连串视频,会以以下的材料陆续发布: ◆ SAS在财务研究中的应用  --&g ...

  7. 冒泡排序c++代码_八大排序算法(解释+代码+结果+算法优化)

    >>>欢迎点赞,收藏,转发! 评论区获取源代码与更多更全干货!<<< 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,不需要访问外存便能完成 ...

  8. 距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

    冒泡排序 /*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法 ...

  9. 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)

    本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 采用的物理引擎是:Phaser.js 官网地址:http:// ...

最新文章

  1. 函数作用域,闭包,数据类型的题目
  2. .net post xml 数据
  3. diff and colordiff on Ubuntu
  4. mac下用xattr命令来删除文件的扩展属性
  5. mysql解压缩版配置_MySQL 5.6 for Windows 解压缩版配置安装
  6. 2021Q1美妆行业季度观察报告
  7. 95-10-020-启动-初始化ZK
  8. 设置电脑右下角显示自己的大名
  9. redis数据类型之List
  10. StarGate(星际之门)观看指南
  11. jrtplib使用笔记
  12. Python量化交易策略及回测系统
  13. 进程线程----转自林海峰
  14. latex 多张子图,横栏/双栏
  15. this beta version of Typora is expired, please download and install a newer version.Typora
  16. Mapreduce统计
  17. PrimeNG之FileUpload
  18. HDFS开启HA后,Hbase的REGIONSERVERS启动错误(Operation category READ is not supported in state standby)
  19. 人物志 | 美团技术委员会前端通道主席洪磊:爱折腾的斜杠青年
  20. 使用DGL实现基于闲鱼图进行边分类算法

热门文章

  1. 【场景化解决方案】销帮帮酷应用,帮助企业销售团队实现精细化管理
  2. Android 5.x SEAndroid/SElinux内核节点的读写权限
  3. 他是马化腾的偶像,拒绝过马云的应聘!如今劝年轻人躺平......
  4. 支付宝当面付扫码支付支付后不回调_刷脸支付每周问题集锦
  5. 笔记 GWAS 操作流程2-6:去掉亲缘关系近的个体
  6. 极鹰云融合cdn用在云服务器如何加速
  7. 中国移动设备用户体验调研报告
  8. 有源医疗器械说明书如何编写?附核查清单
  9. 荟研新材料 光固化防污树脂 含氟防污UV树脂 PMAA、PET、PC、金属等材质的表面加硬处理
  10. Kibana:如何开始使用 Kibana