关于连续登录的问题探究

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

数据形式如下:

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 条评论
登录 后参与评论

相关文章

来自专栏码云1024

C#判断画的图形是不是三角形

3174
来自专栏不想当开发的产品不是好测试

jstack jstat 简易使用教程

jstack – 用来查看堆栈信息 jstat – 用来查看JVM相关信息 jstack用法 找到CPU使用最高的进程; top命令,然后按P,CPU使用率排序...

2138
来自专栏大数据架构

Spark SQL 性能优化再进一步 CBO 基于代价的优化

上文Spark SQL 内部原理中介绍的 Optimizer 属于 RBO,实现简单有效。它属于 LogicalPlan 的优化,所有优化均基于 Logical...

653
来自专栏乐沙弥的世界

Oracle 重建索引的必要性

      索引重建是一个争论不休被不断热烈讨论的议题。当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于...

651
来自专栏Kotlin入门系列

C#控制台基础 将十六进制的字符串 转换成 十进制数

1615
来自专栏linjinhe的专栏

隔离级别、SI 和 SSIACID隔离级别Snapshot IsolationSerializable Snapshot Isolation

1144
来自专栏从ORACLE起航,领略精彩的IT技术。

Oracle数据库该如何着手优化一个SQL

3024
来自专栏数据库

MySQL数据库性能优化之四

优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 ...

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

海量数据迁移之分区并行切分(r2笔记60天)

在海量的数据迁移中,如果某个表特别大,可以考虑对表中的分区进行切分,比如某个表有100g,还有100个分区,那么可以考虑针对这100个分区,那么可以考虑把这10...

2624
来自专栏ml

java多线程下如何调用一个共同的内存单元(调用同一个对象)

1 /* 2 * 关于线程下共享相同的内存单元(包括代码与数据) 3 * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。 4 * ...

3225

扫码关注云+社区