有一个表存放点击记录:序号id , 杂志id,杂志期号,读者id,点击时间
例如                  1          1001   01        555      2007.3.6
                      2          1001   01        555      2007.3.7
                      3          1001   08        555      2007.3.7
                      4          1005   06        888      2007.3.5
                      5    ………………………………………………想把这些数据整理一下,提取出每个用户最后浏览的5条记录,要求同读者id,相同杂志期id 多次点击算一次  使用oracle语法

解决方案 »

  1.   


    select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
    from Table where rn<=5
      

  2.   

    不能通过,那个t.*那里有问题。oracle可以用??
      

  3.   

    select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
    from Table t where rn<=5t是表的別名,再試試
      

  4.   

    ORA-00904:“RN”无效的标识符
      

  5.   

    再套一層呢
    select * from (
    select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
    from Table t)
    where rn<=5
      

  6.   

    select * from(
    select row_number() over (partition by 读者id order by 点击时间 desc) rn,t.*
    from Table t)
    where rn<=5
      

  7.   

    还是没有把同用户浏览相同期的记录过滤掉。而且我觉得rn<=5只是最后限制输出5条。并没有让每个用户id最多输出5条
      

  8.   

    Select 杂志ID,杂志期号,读者ID,点击时间 from
    (select 杂志ID,杂志期号,读者ID,
           row_number() over (partition by 杂志id,杂志期号,读者id order by 杂志id,杂志期号,读者id,点击时间 desc) as 序号,点击时间
      from table_name)
    Where 序号<=5其中的table_name请自行替换吧
      

  9.   

    如果在上述语句中要实现你说的只有一条记录的不显示,目前没有发现好的方法,暂时只能在采取用 group by 杂志ID,杂志期号,读者ID having count(点击时间)>1 来做一个子集先虑除掉只有一次点击的记录
      

  10.   

    路人甲前5次看杂志A的第一期,后5次都看的该杂志的第二期,你需要统计出来什么样的记录?
      是一条记录 杂志A,第一期,路人甲,1次
    还是两条记录 杂志A,第二期,路人甲,1次 呢?
                 杂志A,第一期,路人甲,1次
    要求不同统计方法不一样哦!
      

  11.   

    create table t(
            m_id  varchar2(4),
    q_id  varchar2(2),
    u_id  varchar2(3),
    dt    varchar2(8));
      

  12.   

    insert into t values(
     1001,01,555,'2007.3.6'); 
     insert into t values(
     1001,01,555,'2007.3.7');
     insert into t values(
     1001,08,555,'2007.3.7');
     insert into t values(
     1001,08,555,'2007.3.9');
     insert into t values(
     1002,01,555,'2007.3.6');
     insert into t values(
     1002,01,555,'2007.3.5');
    insert into t values(
     1002,03,555,'2007.3.4');
     insert into t values(
     1008,01,555,'2007.3.4');
     insert into t values(
     1008,01,555,'2007.3.9');
     insert into t values(
     1008,01,555,'2007.3.4');
    insert into t values(
     1008,03,555,'2007.3.4');
     insert into t values(
     1008,03,555,'2007.3.5'); insert into t values(
     1001,01,888,'2007.3.6'); 
     insert into t values(
     1001,01,888,'2007.3.7');
     insert into t values(
     1001,08,888,'2007.3.7');
     insert into t values(
     1001,08,888,'2007.3.9');
     insert into t values(
     1002,01,888,'2007.3.6');
     insert into t values(
     1002,01,888,'2007.3.5');
    insert into t values(
     1002,03,888,'2007.3.4');
     insert into t values(
     1002,03,888,'2007.3.7');
     insert into t values(
     1008,01,888,'2007.3.7');
     insert into t values(
     1008,01,888,'2007.3.8');
    insert into t values(
     1008,03,888,'2007.3.4');
     insert into t values(
     1008,03,888,'2007.3.5');insert into t values(
     1001,01,666,'2007.3.6'); 
     insert into t values(
     1001,01,666,'2007.3.7');
     insert into t values(
     1001,08,666,'2007.3.7');
     insert into t values(
     1001,08,666,'2007.3.9');
     insert into t values(
     1002,01,666,'2007.3.6');
     insert into t values(
     1002,01,666,'2007.3.5');
    insert into t values(
     1002,03,666,'2007.3.4');
     insert into t values(
     1002,03,666,'2007.3.8');
     insert into t values(
     1008,01,666,'2007.3.9');
     insert into t values(
     1008,01,666,'2007.3.7');
    insert into t values(
     1008,03,666,'2007.3.4');
     insert into t values(
     1008,03,666,'2007.3.5');
      

  13.   


    create view v2 as 
    select t1.u_id,t1.m_id,t1.q_id,max(t1.dt) dt
     from t t1,t t2
     where t1.u_id=t2.u_id and t1.m_id=t2.m_id and t1.q_id=t2.q_id
     group by t1.u_id,t1.m_id,t1.q_id
     order by t1.u_id,dt desc;
      

  14.   

    改成下面的试试?!
    select * from (
    select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
    from 
    (
    select 杂志id,杂志期号,读者id,max(点击时间) as 点击时间 from table Group by 杂志id,杂志期号,读者id
    ) t
    )
    where rn<=5
      

  15.   

    我已经做出来,只是连续发了三次,系统就提示不准我发了!
    select u_id,m_id,q_id,dt
    from 
    (select u_id,m_id,q_id,dt,rank() over (partition by u_id order by dt desc) as ord 
     from v2)
    where ord <=5;U_ID   M_ID     Q_ID DT
    ------ -------- ---- ------------
    555    1001     8    2007.3.9
           1008     1    2007.3.9
           1001     1    2007.3.7
           1002     1    2007.3.6
           1008     3    2007.3.5
    666    1001     8    2007.3.9
           1008     1    2007.3.9
           1002     3    2007.3.8
           1001     1    2007.3.7
           1002     1    2007.3.6
    888    1001     8    2007.3.9
           1008     1    2007.3.8
           1001     1    2007.3.7
           1002     3    2007.3.7
           1002     1    2007.3.6已选择15行。
      

  16.   

    SQL> select * from v2;U_ID   M_ID     Q_ID DT
    ------ -------- ---- --------------
    555    1001     8    2007.3.9
           1008     1    2007.3.9
           1001     1    2007.3.7
           1002     1    2007.3.6
           1008     3    2007.3.5
           1002     3    2007.3.4
    666    1001     8    2007.3.9
           1008     1    2007.3.9
           1002     3    2007.3.8
           1001     1    2007.3.7
           1002     1    2007.3.6
           1008     3    2007.3.5
    888    1001     8    2007.3.9
           1008     1    2007.3.8
           1001     1    2007.3.7
           1002     3    2007.3.7
           1002     1    2007.3.6
           1008     3    2007.3.5已选择18行。只是大概做出来了,完全没考虑性能 请多指教!
      

  17.   

    czbbbs(强弩) ( )  的應該可以吧
      

  18.   

    U_ID   M_ID     Q_ID DT
    ------ -------- ---- ----------------
    555    1001     8    2007.3.9
           1001     1    2007.3.7
           1002     1    2007.3.6
           1008     3    2007.3.5
           1008     1    2007.3.9
    666    1001     8    2007.3.9
           1001     1    2007.3.7
           1002     3    2007.3.8
           1002     1    2007.3.6
           1008     1    2007.3.9
    888    1001     8    2007.3.9
           1001     1    2007.3.7
           1002     3    2007.3.7
           1002     1    2007.3.6
           1008     1    2007.3.8已选择15行。
    可以做出这样的效果来.
    不知有何意见
      

  19.   

    select t1.u_id,t1.m_id,t1.q_id,max(t1.dt) dt
     from t t1,t t2
     where t1.u_id=t2.u_id and t1.m_id=t2.m_id and t1.q_id=t2.q_id
     group by t1.u_id,t1.m_id,t1.q_id就保证了 每个用户所读的每种杂志的每期的最新时间,而且绝不会重复,剩下就是排序方面的问题了.请楼主把 需求描述清楚些.
    高手们给出些比较简洁的方法来吧!
      

  20.   

    SELECT t.* 
    FROM(
        SELECT t.*,
          rank()over(PARTITION BY t.u_id ORDER BY t.dt DESC ,t.m_id,t.Q_ID, t.u_id ) ord
        FROM(
          SELECT DISTINCT 
              t.U_ID u_id,
              t.M_ID m_id,
              t.Q_ID q_id,
              max(t.dt) dt
          FROM t 
         GROUP BY 
             t.U_ID,
             t.M_ID,
             t.Q_ID
         ORDER BY 
             t.U_ID,
             dt DESC
         ) t
      )t
    WHERE t.ord <= 5
    谢谢smallsophia() 的思路,
    但在这指出smallsophia()其中有一点点小BUG,
    就是在partition中没考虑回出现重复的ord.
    如果上面 555 1002 3  2007.3.4 这条数据改成
    555 1002 3  2007.3.5 问题就出来了.
    我把我写的代码放上来以供参考,我也是个初学者.
    大家一起学习
      

  21.   

    谢谢大家的帮助我尽力把需要明确表示一下table 是一个点击量统计的表。里面由很多信息,比如用户a 点的哪份杂志,哪期杂志,还有点击时间精确到秒我需要一条语句,或者2条也可以。无论这个用户有多少条记录只取5条,按时间倒叙。但是有一条件,如果这个用户最后点击的5次里,有2条以上的相同点击“杂志id”,“期id”那么就取最近的一次点击数据。如果不足5条继续从下面的数据取,当然还是要做判断,看看是不是有相同的期id