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

 

数据形式如下:

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