欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

oracle查询新增用户数,该如何处理

更新时间: 2014-01-05 02:11:09 责任编辑: Author_N1

 

oracle查询新增用户数
表结构

日期 date
用户 userid
其他字段

需求:查询把date分组,查出date之前从未出现过的userid个数,即新增用户数

如:
date           userid    其他字段
2012-10-01     1
2012-10-01     2
2012-10-01     3
2012-09-22     1
2012-08-22     1


结果为2、3,即一共2个,date、userid皆有索引,查询效率要高,因为数据量很大
--参考方法--

--为什么需要对日期进行分组呢,你不是统计指定日期前未出现过的人数吗?
with t("date",userid) as(
select to_date('2012-10-01','yyyy-mm-dd'),1 from dual
union all select to_date('2012-10-01','yyyy-mm-dd'),2 from dual
union all select to_date('2012-10-01','yyyy-mm-dd'),3 from dual
union all select to_date('2012-09-22','yyyy-mm-dd'),1 from dual
union all select to_date('2012-08-22','yyyy-mm-dd'),1 from dual
)
select count(distinct userid) total from t where t."date">trunc(sysdate)
and not exists(select 1 from t t1 where t.userid=t1.userid and t1."date"<=trunc(sysdate));

--参考方法--
select Count(*) from tb where date>to_date(date,'yyyy-mm-dd') and userid not in
(select distinct userid from tb where date<=to_date(date,'yyyy-mm-dd'))
--参考方法--
还有你的userid,date最好有联合索引,执行效率应会高些
--参考方法--
with t (dt, userid) as (
select to_date('2012-10-01', 'yyyy-mm-dd'), 1 from dual
union all select to_date('2012-10-01', 'yyyy-mm-dd'), 2 from dual
union all select to_date('2012-10-01', 'yyyy-mm-dd'), 3 from dual
union all select to_date('2012-09-22', 'yyyy-mm-dd'), 1 from dual
union all select to_date('2012-08-22', 'yyyy-mm-dd'), 1 from dual
)
select distinct(userid) from t where not exists
(select 1 from t t1 where t.userid=t1.userid and t1.dt < to_date('2012-09-30','yyyy-mm-dd'));


把t1.dt < to_date('2012-09-30','yyyy-mm-dd')这里的2012-09-30换成你需要指定的时间。

上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:11:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/6711/
本文WWW.DOC100.NET DOC100.NET版权所有。