关于连续登录的问题探究

经常会在数据统计中取筛选连续性的数据,比如筛选连续三个月都登录的用户,

数据形式如下:

1 111 222 333
2 111
3 111 222
4 111 444   

大体的意思就是1 2 3 4代表月份1,2,3,4

111,222,333,444代表用户

1 111 222 333 代表一月份用户111 222 333登录了。

以此类推

如果要查找连续三个月登录的用户,我把数据结构进行了改进

1 111
1 222
1 333
2 111
3 111
3 222
4 111
4 444

这样就更符合关系型了。

我简单模拟了下。

SQL> create table test(id1 number,id2 number);
Table created.
SQL> select id2,id1 from test;
       ID2        ID1
---------- ----------
       111          1
       222          1
       333          1
       111          2
       111          3
       222          3
       111          4
       444          4
--利用最大月份 减去 最小月份 +1 (不跨年的情况下),然后除去关联的月份数,如果是1,那就证明连续几个月就登录了
SQL> select id2,max(id1),min(id1),count(*),max(id1)-min(id1)+1 from test
  2  group by id2 having (max(id1)-min(id1)+1)>2
  3  /
       ID2   MAX(ID1)   MIN(ID1)   COUNT(*) MAX(ID1)-MIN(ID1)+1
---------- ---------- ---------- ---------- -------------------
       111          4          1          4                   4
       222          3          1          2                   3
SQL> select id2,max(id1),min(id1),count(*),max(id1)-min(id1)+1 from test group by id2;
       ID2   MAX(ID1)   MIN(ID1)   COUNT(*) MAX(ID1)-MIN(ID1)+1
---------- ---------- ---------- ---------- -------------------
       111          4          1          4                   4
       222          3          1          2                   3
       333          1          1          1                   1
       444          4          4          1                   1

一次延伸,如果要查询连续4个月的,那就更好办了。

连续4个月的

SQL> select id2,max(id1),min(id1),count(*),max(id1)-min(id1)+1 from test group by id2 having  (max(id1)-min(id1)+1)/count(id1)=1 and count(id1)=4
  2  /
       ID2   MAX(ID1)   MIN(ID1)   COUNT(*) MAX(ID1)-MIN(ID1)+1
---------- ---------- ---------- ---------- -------------------
       111  

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-03-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏祥子的故事

mysql | 计算排名

3448
来自专栏james大数据架构

你真的会玩SQL吗?玩爆你的数据报表之存储过程编写(上)

你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真...

1948
来自专栏杨建荣的学习笔记

oracle中关于小数中0的格式化(55天)

今天碰到一个小问题,分享一下。 oracle中输入0.1查出的时候是.1,现在想把结果格式化成varchar2,格式化成0.10,保留两位精度。 先拿大于1的数...

3085
来自专栏杨建荣的学习笔记

一个SQL性能问题的优化探索(二)(r11笔记第38天)

继续前几天的一个案例一个SQL性能问题的优化探索(一)(r11笔记第33天) 如下的SQL语句存在索引字段CARD_NO,但是执行的时候却走了全表扫描,因为这是...

3308
来自专栏木宛城主

你必须掌握的一些常见的SQL语句,包含单表查询、高级查询(连接查询、复合条件查询、嵌套查询)

分享一些常见的SQL语句,包含单表查询、高级查询(连接查询、复合条件查询、嵌套查询等)。 --建立学生信息表Students create table Stud...

1617
来自专栏数据和云

【安全警告】Oracle 12c 多租户的SQL注入高危风险防范

在使用Oracle多租户选件时,由于Container容器和PDB融合共存,则权限控制必将更加重要,在之前的文章中我们提到,Oracle 12.2 的 loc...

3276
来自专栏PPV课数据科学社区

【学习】图解SQL连接语句

SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看是很自然而然的。假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。 id name ...

3379
来自专栏java学习

Oracle基础试题与答案!

表结构: create table tbEmp --职员表 ( eID number(7) primarykey, ...

28612
来自专栏生信技能树

没有自己的服务器如何学习生物数据分析(下篇)

编者注:在上篇文章《没有自己的服务器如何学习生物数据分析》上篇,我们对 IBM 云计算平台有了基本了解,也学习了如何对数据进行下载上传以及基本的预处理。 在《没...

2927
来自专栏Aloys的开发之路

SQL Server常用语句

-- 身份证验证(SQLServer) -- 主要验证SQL数据库中已输入的15位 及18位 身份证号码的位数、出生年月日是否正确,可以过滤出大部分的输入错误...

1795

扫描关注云+社区