本帖最后由 dong_smile 于 2011-03-11 22:57:03 编辑

解决方案 »

  1.   

    再顶一下,求各位大侠帮忙啦,最好能把sql写出来
      

  2.   

    表里有多少数据?
    如果很多,用SQL直接实现的话运行会很慢。
      

  3.   

    最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
    如果有多表,表之间如何关联?
    发帖注意事项
    http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
      

  4.   

    就只考虑这一个表就可以,我先借鉴一下查询的方法,计算发法就是根据下面的注解查询,比如pv就是对这个表的总数据之和count(*),group by客户端序列,uv就是要group by 访问时间、客户端序列、来源url,我们今天的pv量,今天的uv量、昨天的pv量等,每个sql分开都能求出来,可是我不知道有没有什么好的方法可以拼出一个大的sql,把所需要的数据一块求出来(要考虑性能的)
      

  5.   

    --今天
    (select  websiteId,count(1) from table where to_char(sysdate,'yyyymmdd')=to_char(visit_startTime,'yyyymmdd') group by sourceurl,client_squence,single_ip) a1
    --昨天
    left join (select  websiteId,count(1) from table where to_char(sysdate-1,'yyyymmdd')=to_char(visit_startTime,'yyyymmdd') group by sourceurl,client_squence,single_ip) a2
    算是给你一个例子吧。最近开始折腾ORACLE,发现对oracle懂得有点少,但是SQL就没有啥问题了
      

  6.   

    可能sysdate那块有点问题,你就先担待下吧
      

  7.   

    如果这样左联的话,那我岂不是要连接32个表了,今天的pv,uv,独立ip,唯一访问量,昨天...?
      

  8.   

    /*网站信息表*/
    create table urlinfo
    (
    id int,            /*网站id*/
    weburl varchar(20) /*网站名称*/
    )
    insert into test1 select 3801,'网站1'
    insert into test1 select 3802,'网站2'
    /*网站来路信息表*/
    create table sourceinfo
    (
     id                  int, /*id主键*/
     source_url          varchar(20), /*来源url*/
     visit_url           varchar(20), /*访问url*/
     visit_start_time    datetime,  /*访问开始时间*/
     visit_end_time      datetime,  /*访问结束时间*/
     visit_domain_name   varchar(20),/*访问url域名*/
     client_squence      varchar(20),/*客户端序列*/
     website_id          varchar(20),/*网站id,外键*/
     source_domain_name  varchar(20),/*来源url域名*/
     visit_time          varchar(20),/*访问时长*/
     single_ip           varchar(20) /*独立ip*/
    )
    insert into sourceinfo
     select 1,'www.baidu.com/aa','www.aaa.com/aa','2011-03-12 12:25:45','2011-03-12 12:35:45','www.aaa.com','qerrewqpoe1',3801,'www.baidu.com','10','192.168.10.21'
    insert into sourceinfo 
    select 2,'www.gougou.com/aa','www.bbb.com/aa','2011-03-12 12:25:45','2011-03-12 12:35:45','www.bbb.com','qerrewqpoe1',3802,'www.gougou.com','10','192.168.10.22'
    /*
    要得到这样的报表:
    weburl 今天         今天                   今天               今天             昨天         昨天                   昨天               昨天           本周....(一次类推)
    网站1  pv量    uv独立访客访问量          独立ip访问量     绝对唯一访客访问量   pv量    uv独立访客访问量          独立ip访问量     绝对唯一访客访问量
    网站1  pv量    uv独立访客访问量          独立ip访问量     绝对唯一访客访问量   pv量    uv独立访客访问量          独立ip访问量     绝对唯一访客访问量
    */
      

  9.   

    大sql肯定会慢,在实现此功能的时候想选择一个性能最优的sql,没办法啊,就这样的要求
      

  10.   

    咱给你了一个方向而已。这个方式可以做优化的说。而且,这个方法配合视图操作,你会省心很多。如果使用函数或者说存储过程,并不会有太大的执行问题。
    今天、昨天、本周、上周、本月、上月、本年、上年的(根据访问时间)你如果只是按照这个要求的话,并不需要像昨天,7天前止痒的诗句的话,直接使用group by 进行分组统计就可以了。统计的时候,只是对visit_start_time进行分别的格式化就可以了。select to_char(sysdate,'w') from table where rownum<1;--当前是第几周select to_char(sysdate,'mm') from table where rownum<1;--当前是第几月select to_char(sysdate,'yyyy') from table where rownum<1;--当前是第几年
      

  11.   

    在家里面蹲着没有环境的说。这机器貌似跑不动oracle8以上的版本下午出门,晚上我想办法给你弄几个例子出来吧。
      

  12.   

    你统计条件不同,并且统计条件只能使用group by的方式进行。所以你的SQl也只能使用left join 进行连接了。不过,我想到了一个解决的方法,这个方法就是建立一个统计记录表,把旧的同济信息都填入到这个零时表中,就没有那么麻烦的SQL了。当然了,往这个记录表中写数据,就是得一个巨大的SQl语句了。当然了,这个表可以是一个,也可以是多个,你可以进行日结统计表,也可以做一个周结统计表,想当然尔,月结统计表也是你也可以做的。年的就不需要了,年的直接通过对月结统计表进行相关的统计就出来结果了。实际上,月结的我认为也没有制作的必要,,这个等一下我来进行相关的说明。
    --当天
    select VISIT_DOMAIN_NAME,to_char(VISIT_START_TIME,'yyyymmdd'),count(1) from SOURCEINFO  where to_char(sysdate-7,'yyymmdd')=to_char(VISIT_START_TIME,'yyymmdd') group by VISIT_DOMAIN_NAME,to_char(VISIT_START_TIME,'yyyymmdd') ;--本周select VISIT_DOMAIN_NAME,to_char(VISIT_START_TIME,'ww'),count(1) from SOURCEINFO  where to_char(sysdate,'yyyyww')=to_char(VISIT_START_TIME,'yyyyww') group by VISIT_DOMAIN_NAME,to_char(VISIT_START_TIME,'ww');--上周
    select VISIT_DOMAIN_NAME,to_char(VISIT_START_TIME,'ww'),count(1) from SOURCEINFO  where to_char(sysdate-7,'yyyyww')=to_char(VISIT_START_TIME,'yyyyww') group by VISIT_DOMAIN_NAME,to_char(VISIT_START_TIME,'ww');这几个个是PV量。当然你可以适当的修改点内容。其他的只需要修改相应的group by 内容就可以了。
    你如果每天都进行适当的统计,那么,周结和月结、粘结,也可以都省略掉。省略掉的内容,从哪里来呢?我们新建一个表:CREATE TABLE Source_Count
    (
       WEBURL  VARCHAR2(20 BYTE),
       count_date VARCHAR(8 BYTE),
       pv int,--pv量
       ip int,--Ip访问量
       uv int,--Uv独立访客访问量
       sc int--绝对唯一访客访问量
    )这个表用来保存历史访问量。详情的话,咱们换是存在之前的表中。每天23:59分,你可以做一个写入此表的计划任务,把前一天的数据写入到这个表中之后你取的时候就容易多了,直接用WEBURL去取相应的统计就可以了。方法和我之前发的SQL一样。
      

  13.   

    个人觉得decode就可以搞定,不必用什么left join.采取静态报表存放统计数据在不考虑服务器的存储容量的时候应该算的上是一个好的解决办法,对于历史的数据 再分区可能更有效
      

  14.   

    4个字段,如果网站多,可能是会占用不少数据库信息。但是这样做的成本与消耗CPU和硬盘读取来说,个人认为不值一提。当你的获取量达到那种巨大的数据量的时候,这点空间占用实在是太合算了。话说,decode能解决这个问题吗?折腾出来大家看看先~
      

  15.   

    写出来了,但是很大的sql,希望各位有时间还是再提一些比较有效的及建议才好