楼主: weipeng825

【讨论】求SQL-----累计统计去重用户数

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
31#
发表于 2014-6-25 23:19 | 只看该作者
赞一下peter,支持苏上人当反面教材。

使用道具 举报

回复
论坛徽章:
17
生肖徽章2007版:猴
日期:2015-07-24 10:50:33紫水晶
日期:2015-09-14 19:29:07萤石
日期:2015-09-14 19:24:48萤石
日期:2015-09-13 14:30:02萤石
日期:2015-09-11 23:05:02红宝石
日期:2015-09-11 23:04:43萤石
日期:2015-09-11 23:04:27生肖徽章2007版:兔
日期:2015-07-31 16:43:10生肖徽章2007版:龙
日期:2015-07-24 10:51:00生肖徽章2007版:龙
日期:2015-07-24 10:50:51
32#
发表于 2014-6-25 23:24 | 只看该作者
newkid 发表于 2014-6-25 23:19
赞一下peter,支持苏上人当反面教材。

我都成反面教材啦  哎

使用道具 举报

回复
论坛徽章:
8
2011新春纪念徽章
日期:2011-01-04 10:38:21ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152013年新春福章
日期:2013-02-25 14:51:24ITPUB社区千里马徽章
日期:2013-06-09 10:15:34优秀写手
日期:2014-06-25 06:00:12懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
33#
 楼主| 发表于 2014-6-26 09:29 | 只看该作者
newkid 发表于 2014-6-25 23:19
赞一下peter,支持苏上人当反面教材。

版主大神,来个千万级速度点的算法撒

使用道具 举报

回复
论坛徽章:
41
生肖徽章:鼠
日期:2013-12-06 14:15:45生肖徽章:牛
日期:2013-12-06 14:15:45生肖徽章:虎
日期:2013-12-06 14:15:45生肖徽章:兔
日期:2013-12-06 14:15:45生肖徽章:龙
日期:2013-12-06 14:15:45生肖徽章:蛇
日期:2013-12-06 14:15:45生肖徽章:马
日期:2013-12-06 14:15:45生肖徽章:羊
日期:2013-12-06 14:15:45生肖徽章:猴
日期:2013-12-06 14:15:45生肖徽章:鸡
日期:2013-12-06 14:15:45
34#
发表于 2014-6-26 12:47 | 只看该作者
weipeng825 发表于 2014-6-26 09:29
版主大神,来个千万级速度点的算法撒

8楼写法不行?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
35#
发表于 2014-6-26 22:33 | 只看该作者
CREATE TABLE  t as
select 1 a,'A'b from dual union
select 1 a,'B'b from dual union
select 1 a,'A'b from dual union
select 2 a,'B'b from dual union
select 2 a,'C'b from dual union
select 3 a,'A'b from dual union
select 4 a,'A'b from dual union
select 4 a,'D'b from dual union
select 4 a,'E'b from dual union
select 5 a,'A'b from dual;


用分析函数:

SELECT a,SUM(SUM(DECODE(rn,1,1))) OVER(ORDER BY a) cnt
FROM (SELECT t.*,ROW_NUMBER() OVER(PARTITION BY b ORDER BY a) rn FROM t)
GROUP BY a;

         A        CNT
---------- ----------
         1          2
         2          3
         3          3
         4          5
         5          5

         
用分组聚合:
SELECT a,SUM(COUNT(*)) OVER(ORDER BY a) cnt
FROM (SELECT b,MIN(a) a FROM t GROUP BY b)
GROUP BY a;

         A        CNT
---------- ----------
         1          2
         2          3
         4          5

有些日期缺失了,如果要补就用外连接:

SELECT t1.a,LAST_VALUE(t2.cnt IGNORE NULLS) OVER(ORDER BY t1.a)
  FROM  (SELECT DISTINCT a FROM t) t1
        LEFT JOIN
        (SELECT a,SUM(COUNT(*)) OVER(ORDER BY a) cnt
         FROM (SELECT b,MIN(a) a FROM t GROUP BY b)
        GROUP BY a
        ) t2
ON t1.a=t2.a;

使用道具 举报

回复
论坛徽章:
3
2012新春纪念徽章
日期:2012-01-04 11:58:18双黄蛋
日期:2012-01-05 14:01:192014年世界杯参赛球队: 厄瓜多尔
日期:2014-07-02 10:32:37
36#
发表于 2014-6-27 11:00 | 只看该作者
newkid 发表于 2014-6-26 22:33
CREATE TABLE  t as
select 1 a,'A'b from dual union
select 1 a,'B'b from dual union

赞!和大神想到一起了

使用道具 举报

回复
论坛徽章:
8
2011新春纪念徽章
日期:2011-01-04 10:38:21ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152013年新春福章
日期:2013-02-25 14:51:24ITPUB社区千里马徽章
日期:2013-06-09 10:15:34优秀写手
日期:2014-06-25 06:00:12懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
37#
 楼主| 发表于 2014-6-27 11:17 | 只看该作者
peter1166 发表于 2014-6-26 12:47
8楼写法不行?

这个是可以的,我还想参考其他的算法

我实际处理中还有好几个维度,还要做cube维度汇总运算。
这样的话,row_number标记就不可以复用了。。。。

使用道具 举报

回复
论坛徽章:
8
2011新春纪念徽章
日期:2011-01-04 10:38:21ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152013年新春福章
日期:2013-02-25 14:51:24ITPUB社区千里马徽章
日期:2013-06-09 10:15:34优秀写手
日期:2014-06-25 06:00:12懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
38#
 楼主| 发表于 2014-6-27 11:19 | 只看该作者
newkid 发表于 2014-6-26 22:33
CREATE TABLE  t as
select 1 a,'A'b from dual union
select 1 a,'B'b from dual union

版主大人,实际处理中还有好几个维度,最后还要做cube维度汇总运算。
这样的话,row_number标记, 前面group分组都不怎么行。。。。。。

使用道具 举报

回复
论坛徽章:
3
2012新春纪念徽章
日期:2012-01-04 11:58:18双黄蛋
日期:2012-01-05 14:01:192014年世界杯参赛球队: 厄瓜多尔
日期:2014-07-02 10:32:37
39#
发表于 2014-6-27 12:46 | 只看该作者
drop table ms_test;
--建表
create table ms_test(id number,
name varchar2(200));

--随机插入1w行
begin
  for i in 1..10000 loop
      insert into ms_test values(ceil(dbms_random.value(1,10)),ceil(dbms_random.value(1,20000)));
  end loop;
end;
/

select * from ms_test;

--------------------------------------
--方法一 先去重,取id最小的一条。然后外层用分析函数。
select mid, sum(cn) over(order by mid) n
  from (select mid, count(name) cn
          from (select min(id) mid, name from ms_test group by name)
         group by mid);
--用时0.219s

--方法二--     
   
with s as(select a.id id2,t.name from ms_test t,ms_test a
where t.id<=a.id)
select id2,count(distinct name)c from s group by id2
order by id2;

--耗时34.944s,非等值自连接虽然思路巧妙,但是数据量大的时候,计算过程不可承受

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
40#
发表于 2014-6-27 22:10 | 只看该作者
weipeng825 发表于 2014-6-27 11:19
版主大人,实际处理中还有好几个维度,最后还要做cube维度汇总运算。
这样的话,row_number标记, 前面g ...

举出一个多维度的例子。
DISTINCT是无法汇总的,有可能每天数字是1, 月总数也是1 (因为整个月就是同一个人)这个必须先弄清楚。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表