楼主: weipeng825

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

[复制链接]
论坛徽章:
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
41#
 楼主| 发表于 2014-7-1 09:36 | 只看该作者
newkid 发表于 2014-6-27 22:10
举出一个多维度的例子。
DISTINCT是无法汇总的,有可能每天数字是1, 月总数也是1 (因为整个月就是同一个 ...

CREATE TABLE T_TIME AS
             SELECT TO_NUMBER($vDate_CD || '01') AS  DATE_HR_CD FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '02')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '03')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '04')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '05')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '06')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '07')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '08')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '09')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '10')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '11')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '12')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '13')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '14')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '15')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '16')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '17')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '18')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '19')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '20')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '21')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '22')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '23')  FROM DUAL
   UNION ALL SELECT TO_NUMBER($vDate_CD || '24')  FROM DUAL;

DELETE FROM BIEDS.TW_FLOW_ACCSTAT_HR_SUM where DATE_CD = $vDate_CD;

--累计指标
INSERT /*+ APPEND */ INTO TW_FLOW_ACCSTAT_HR_SUM(
   DATE_HR_CD
  ,AREA_CODE
  ,PLAT_TYPE
  ,TOTAL_USER_CNT
  ,TOTAL_LOG_USER_CNT
  ,TOTAL_PAGE_CNT
  ,TOTAL_LOG_PAGE_CNT
   )
  SELECT DATE_HR_CD
        ,NVL(AREA_ID, '0')
        ,NVL(PLAT_ID, '0')
        ,COUNT(DISTINCT NVL(USER_ID, UCODE)) AS TOTAL_USER_CNT
        ,COUNT(DISTINCT USER_ID) AS TOTAL_LOG_USER_CNT
        ,COUNT(*) AS TOTAL_PAGE_CNT
        ,COUNT(USER_ID) AS TOTAL_LOG_PAGE_CNT
    FROM (SELECT T2.DATE_HR_CD, T1.AREA_ID, T1.PLAT_ID, T1.USER_ID, T1.UCODE
            FROM BIEDS.TW_USER_ACC_DTL T1, T_TIME T2
           WHERE T1.DATE_CD <= $vDate_CD
             AND T1.DATE_HR_CD <= T2.DATE_HR_CD)
   GROUP BY DATE_HR_CD ,CUBE(AREA_ID, PLAT_ID);
COMMIT;


上面就是代码示范,因为要求一天24小时的累计汇总。就想了个笨办法,搞了个当天24小时的维表,关联数据翻24倍。。。。。
但实在想不到别的好办法了~

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
42#
发表于 2014-7-1 10:23 | 只看该作者
$vDate_CD ?

使用道具 举报

回复
论坛徽章:
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
43#
 楼主| 发表于 2014-7-1 11:57 | 只看该作者
lastwinner 发表于 2014-7-1 10:23
$vDate_CD ?

呵呵,脚本里面直接copy出来的   yyyymmdd格式

使用道具 举报

回复
论坛徽章:
8
宝马
日期:2013-12-30 15:12:362014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08青年奥林匹克运动会-击剑
日期:2014-08-26 08:46:14马上加薪
日期:2014-12-15 14:55:28马上加薪
日期:2015-01-30 09:13:41美羊羊
日期:2015-03-19 15:04:19水瓶座
日期:2016-01-28 10:23:13
44#
发表于 2014-7-1 16:39 | 只看该作者
本帖最后由 li0924 于 2014-7-1 16:41 编辑
〇〇 发表于 2014-6-22 17:31
with t as(
select 1 a,'A'b from dual union
select 1 a,'B'b from dual union

这题目有点意思;纯属娱乐!
  1. $ awk '{if(! c[$2]++)s++;a[$1]=s}END{for(i=1;i<=asorti(a,b);i++)print b[i],a[b[i]]}' lottu
  2. 1 2
  3. 2 3
  4. 3 3
  5. 4 5
  6. 5 5
  7. $ cat -v lottu
  8. 1 A
  9. 1 B
  10. 1 A
  11. 2 B
  12. 2 C
  13. 3 A
  14. 4 A
  15. 4 D
  16. 4 E
  17. 5 A
复制代码

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
41
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2016-01-13 12:14:26秀才
日期:2016-01-12 11:23:27金牛座
日期:2016-01-03 20:58:56秀才
日期:2015-12-21 09:53:46秀才
日期:2015-12-21 09:48:11秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 15:02:13秀才
日期:2015-11-23 09:48:22秀才
日期:2016-01-21 13:37:04
45#
发表于 2014-7-1 18:36 | 只看该作者
peter1166 发表于 2014-6-22 18:28
with t as(
select 1 a,'A'b from dual union
select 1 a,'B'b from dual union

这里面省略了partition by 能解释下么?

使用道具 举报

回复
论坛徽章:
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
46#
发表于 2014-7-1 19:00 | 只看该作者
Skye_to_Skye 发表于 2014-7-1 18:36
这里面省略了partition by 能解释下么?

分解看,应该能明白吧。


with 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 t.*
           ,row_number()over(partition by b order by a) rn
from t;
   
         A B         RN
---------- - ----------
         1 A          1
         3 A          2
         4 A          3
         5 A          4
         1 B          1
         2 B          2
         2 C          1
         4 D          1
         4 E          1

with 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 t1.a ,t1.b
        ,rn
        ,decode(rn,1,1,0)
       ,sum(decode(rn,1,1,0))over( order  by a, b) b_cnt
from (
        select t.*
               ,row_number()over(partition by b order by a) rn
        from t
     ) t1
         A B         RN DECODE(RN,1,1,0)      B_CNT
---------- - ---------- ---------------- ----------
         1 A          1                1          1
         1 B          1                1          2
         2 B          2                0          2
         2 C          1                1          3
         3 A          2                0          3
         4 A          3                0          3
         4 D          1                1          4
         4 E          1                1          5
         5 A          4                0          5
         
with 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 t2.a ,max(b_cnt) b_cnt
from (
        select t1.a ,t1.b
               ,sum(decode(rn,1,1,0))over( order  by a, b) b_cnt
        from (
                select t.*
                       ,row_number()over(partition by b order by a) rn
                from t
             ) t1
       ) t2
group by t2.a;     
          A      B_CNT
---------- ----------
         1          2
         2          3
         3          3
         4          5
         5          5
           

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
41
2017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2016-01-13 12:14:26秀才
日期:2016-01-12 11:23:27金牛座
日期:2016-01-03 20:58:56秀才
日期:2015-12-21 09:53:46秀才
日期:2015-12-21 09:48:11秀才
日期:2015-12-18 09:28:57秀才
日期:2015-12-14 15:02:13秀才
日期:2015-11-23 09:48:22秀才
日期:2016-01-21 13:37:04
47#
发表于 2014-7-1 20:56 | 只看该作者
peter1166 发表于 2014-7-1 19:00
分解看,应该能明白吧。

很感谢您的回答。。。。谢谢

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
4
林肯
日期:2013-07-30 18:00:55奔驰
日期:2013-08-04 16:30:37奥迪
日期:2013-08-12 12:28:15阿斯顿马丁
日期:2014-01-09 18:07:50
48#
发表于 2014-7-2 00:29 | 只看该作者
  1. with t as(
  2. select 1 a,'A'b from dual union
  3. select 1 a,'B'b from dual union
  4. select 1 a,'A'b from dual union
  5. select 2 a,'B'b from dual union
  6. select 2 a,'C'b from dual union
  7. select 3 a,'A'b from dual union
  8. select 4 a,'A'b from dual union
  9. select 4 a,'D'b from dual union
  10. select 4 a,'E'b from dual union
  11. select 5 a,'A'b from dual),
  12. t1 AS (SELECT a ,CASE WHEN b=pre_b THEN
  13. 0
  14. ELSE
  15. 1
  16. END RESULT
  17. FROM (
  18. SELECT a,b,lag(b) over(ORDER BY b,a) pre_b FROM t ORDER BY b)
  19. ORDER BY a)
  20. SELECT DISTINCT  a,SUM(RESULT) over(ORDER BY a) counts FROM t1
  21. ORDER BY a;

复制代码

使用道具 举报

回复
论坛徽章:
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
49#
发表于 2014-7-3 00:13 | 只看该作者
多维度就多用几次分析函数吗:

CREATE TABLE  t as
select 1 a,'A'b,'Q'c from dual union
select 1 a,'B'b,'W'c from dual union
select 1 a,'A'b,'W'c from dual union
select 2 a,'B'b,'Q'c from dual union
select 2 a,'C'b,'S'c from dual union
select 3 a,'A'b,'R'c from dual union
select 4 a,'A'b,'T'c from dual union
select 4 a,'D'b,'Q'c from dual union
select 4 a,'E'b,'V'c from dual union
select 5 a,'A'b,'W'c from dual;


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

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
50#
发表于 2017-5-25 16:58 | 只看该作者
先按时间,用户名查询唯一记录
再只保留最小的一条记录,
再进行累加
应该可以满足这个要求。

使用道具 举报

回复

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

本版积分规则 发表回复

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