select bid,vid,pid 
from (select a.bid,
              a.vid,
              a.pid,
              dense_rank() over (partition by bid order by vid) rm 
              from  (select * 
                     from (select bid,
                                  vid,
                                  pid,
                                  row_number() over(partition by bid,vid order by pid) type_vip 
                           from tab_name where type_vip<4) a )  where rm<3

解决方案 »

  1.   

    type_id<4   每种类型选择3种产品
    rm<3        每个用户选择2种类型
    这个效率可能较低,期待高手
      

  2.   

    如果把抽取的工作放在应用程序中,可以解决问题。但是就必须先返回按BID,VID排序的7百万数据,然后从头检索,已经满足条件(最多n个分类,每个分类最多m个产品)的顾客就跳过他的剩余记录,一直到尾。这种方法已经试过,非常可怕的办法,所以寻求在SQL的解决办法。感激不尽!
      

  3.   

    谢谢zlqs(啊啊啊) 但是type_vip  报错 '无效列名'
      

  4.   

    select bid,vid,pid 
    from (select a.bid,
                  a.vid,
                  a.pid,
                  dense_rank() over (partition by bid order by vid) rm 
                  from  (select * 
                         from (select bid,
                                      vid,
                                      pid,
                                      row_number() over(partition by bid,vid order by pid) type_vip 
                               from tab_name) where type_vip<4) a )  where rm<3
      

  5.   

    谢谢,我正在试,如果我的tab_name表还有其他两个字段SID,UID需要一齐被select,应该怎么加呢。这样对不? select bid,vid,pid,sid,uid
    from (select a.bid,
                  a.vid,
                  a.pid,
                  a.sid
                  a.uid
                  dense_rank() over (partition by bid order by vid) rm 
                  from  (select * 
                         from (select bid,
                                      vid,
                                      pid,
                                      sid,
                                      uid
                                      row_number() over(partition by bid,vid order by pid) type_vip 
                               from tab_name) where type_vip<4) a )  where rm<3
      

  6.   

    dense_rank() over (partition by bid order by vid) rm 怎么理解,我找了很多资料怎么找不到over是什么意思?请指点
      

  7.   

    crazyCSDNx(疯叉)  那是分析函数
    oacle 的文档 sql reference 中有介绍
      

  8.   

    在oracle文档里翻了一便,还是找不到