表包含2个字段
date           userid
2009-06-01     mike
2009-06-01     tom
2009-06-01     rose
2009-06-02     mike
2009-06-02     jake
2009-06-03     tom
2009-06-03     mike
。。
如上表,date记录了日期,userid记录了该日期中登录过的用户id
现在需要知道,这些用户上线的忠诚度,也就是,按天统计,哪些用户天天上线,上线频度。
例如
我查看2009-05-01 到 2009-06-01 这一个月间中,按照上线次数多少 排序显示。
例如:
2人(2个userid)   29次
3人               22次
10人              18次
18人              12次
这样的一个结果。表明这一个月中来过29次的有2个userid,来过22次的有三个id
我想问一下,这个能否用sql语句解决?如果能需要分几步,应该怎样写这个sql
期待大家帮助,谢谢!

解决方案 »

  1.   


    select count(num),num from (
    select count(userid ) Num ,userid  from table where to_char(date,'YYYY-MM-DD' )>2009-05-01  and to_char(date,'YYYY-MM-DD' )<'2009-06-01'
    group by userid 
    )a
    group by num 
    LZ看是不是这个意思
      

  2.   

    select count(num)|| '人', num from (
    select count(userid ) num ,userid  from table 
    where to_char(date,'YYYY-MM-DD' )>=2009-05-01  
    and to_char(date,'YYYY-MM-DD' )<'2009-06-01'
    group by userid 
    )a
    group by num 
      

  3.   

    非常感谢yangfuen637200的精准解答,也谢谢其他同学!
    我还有个问题。真实表数据量很大,每天有20万条,这样统计一个月的时候,会特别慢,要几十秒才能查出来。
    这有什么办法能提高效率吗?
      

  4.   

    试一下并行查询,可以提高点速度;SELECT /*+PARALLEL(A,10)*/
     COUNT(NUM), NUM
      FROM (SELECT /*+PARALLEL(TABLE,10)*/
             COUNT(USERID) NUM, USERID
              FROM TABLE
             WHERE TO_CHAR(DATE, 'YYYY-MM-DD') > '2009-05-01'
               AND TO_CHAR(DATE, 'YYYY-MM-DD') < '2009-06-01'
             GROUP BY USERID) A
     GROUP BY NUM