LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL常用算法-判断数据是否连续

admin
2024年3月30日 12:59 本文热度 485

常见场景

     经常会遇到一些分析连续次数类的需求,会需要对数据判断是否连续,比如“用户是否连续登入" ,“最多连续点击次数”等等。

     对于连续2次,连续3次这种固定的连续次数的需求,我们可以通过自关联数据表(join)2次或者3次或者lead/lag开窗函数实现。

     而对于不确定连续次数的需求,比如连续出现100次,总不能进行100次自关联或者写100个函数,因此我们可以增加辅助列的方式判断是否连续,我们可以通过整体自然排序-分组排序的做法进行判断

示例

我们直接引用某网站上的示例数据:有Logs表包含id列和num列

需求:查询所有至少连续出现三次的数字

具体数据如下:

Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+


1.通过自关联方式实现

SELECT DISTINCT

     l1.NUM

FROM

    LOGS l1,

    LOGS l2,

    LOGS l3                --判断连续出现三次,因此自关联三次

WHERE

    l1.Id = l2.Id - 1       ---自关联上下级数据

    AND l2.Id = l3.Id – 1

    AND l1.NUM= l2.NUM

    AND l2.NUM= l3.NUM

2.lead/lag函数方法实现

SELECT DISTINCT NUM FROM (
  SELECT  ID,
          NUM,
          LAG(NUM,1) OVER(ORDER BY ID) LAG,
          LEAD(NUM,1) OVER(ORDER BY ID) LEAD
  FROM LOGS) T
WHERE  NUM=LAG AND NUM = LEAD  --通过偏移+1/-1行数据判断是否连续

3.通过增加辅助列方式判断连续

分别增加需要判断组内的自增长列以及分组增长列

核心思路:对于连续的一组数据,他的自然序列和分组排序序列的差必然相同,通过统计计算这个相同差出现的次数,可以判断他的连续性,即同一个差值统计出现2次,则连续2次,出现3次则为连续3次

SELECT DISTINCT Num FROM (  SELECT NUM,         COUNT(1as SerialCount   FROM     (SELECT Id,Num,      row_number() over(order by id) -      ROW_NUMBER() over(partition by Num order by Id) as SerialNumberSubGroup     FROM       LOGS     ) as SubGROUP BY Num,SerialNumberSubGroup HAVING COUNT(1) >= 3) as Result --判断出现的次数统计


该文章在 2024/3/30 12:59:59 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved