关于连续登录的问题探究

作者: admin 分类: 公众号存档            0 次浏览 发布时间: 2014-03-06 09:17

公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2014-03-06 09:17:34 · 原文链接

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

数据形式如下:

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  

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注