现有一表,两个字段为:用户id,事务id,用户id会有重复,事务id不会重复,代表一个用户可以有多个事务
总计记录数约100万条
现欲取得一个用户列表
要求为:
1.这些用户的事务数是最多的那批人
2.这些用户的事务数合计是总事务数的3%当然,这些事务数的合计可能不会正好是总数的3%,取比较接近的就行了,多一点少一点都可以

解决方案 »

  1.   

    select * from tb
    where 用户id in (select 用户id from (select 用户id, count(事务id) as trn_id 
                                   from tb group by 用户id
                                   order by count(事务id) desc ) t
                      where rownum=1);
    with a as (select count(事务id) as sum_trn from tb),
    with b as (select tb.用户id, abs(count(tb.事务id)/a.sum_trn-0.3) as per_trn
                 from tb left join a on 1=1
                group by tb.用户id
                order by abs(count(tb.事务id)/a.sum_trn-0.3) asc )
    select * from tb
    where tb.用户id in (select b.用户id from b where rownum=1);
      

  2.   

    1:先按用户分组得到用户事务数
    select user_id,count(tran_id)
    from tab
    group by user_id然后取得最多是事务数的用户2:select user_id
    from tab
    group by user_id
    having count(Tran)/(select count(*) from tab)<=0.03
      

  3.   

    可能是我没说清楚,
    我只要一个用户列表,同时满足1,2两个条件
    一般来讲,本表中每个用户的事务数最多有几百,不会出现一个用户的事务已经达到总数的3%这样的情况也就是说先把count(事务id)排序,取前面的一批人,他们的事务数总数是总数的3%,约3万
      

  4.   

    所谓最多的那一批人,需要给出量化指标,比如前 10 名,就跟那个 3% 一样,“大约”这个解决不了。
    我们只能假设就是 前 10 名或不少于 3%。1 或 2 取 union 并集。
      

  5.   

    学习先~~是这写了下SQL,发现楼主的需求分厂深奥啊~
      

  6.   

    这么说吧,就是用一个最小的的用户集合达到3万的事务数
    求此用户集合我现在只会用用户id guoup 然后用excel去加...
      

  7.   

    这个查询取总交易额达到 30000 的最少客户。
    [code=SQL][
    select c.*
    from (
    select b.*, sum(AMOUNT) over (order by IDX) as ROLLING
    from (
    select a.*, row_number() over (order by AMOUNT desc) IDX
    from (
    select 用户id, sum(交易额) as AMOUNT
    from 交易表
    group by 用户id
    order by AMOUNT desc
    ) a
    ) b
    )c 
    where ROLLING < 30000
    ;/code]
      

  8.   

    楼上的语句已经和我的要求非常的接近了
    刚好我自己在用execl解决后回头再慢慢写
    我写的是SELECT *
    FROM (SELECT 用户ID,
     SUM(事务数) OVER(ORDER BY CN DESC) 事务合计,
     RANK() OVER(ORDER BY CN DESC) 事务数排名 (SELECT 用户ID,
     COUNT(*) 事务数
    FROM TB
     GROUP BY 用户ID) TB1) TB2
     WHERE abs(事务合计-30000) < 100;但是问题在于,sum这个分析函数,如果有并列的话,不会马上累加上去,而是会把所有的并列数一起加上去
    比如,事务数大于10的用户的事务总数达到了25000,然后事务数为9的用户有1000位,那么,这1000位的事务合计这个字段都为34000,而不是截取到30000附近
    如    号码 CN 合计 顺序
    15 111 10 238 13
    16 222 10 238 13
    17 333 10 238 13
    18 444 10 238 13
    19 555 10 238 13
    20 666 10 238 13
    21 777 10 238 13
    22 888 9 409 22
    23 999 9 409 22
    24 110 9 409 22
    不知道有没有其他的办法来解决这个问题
      

  9.   

    select userid, max(per), count(1)
      from (select userid, RATIO_TO_REPORT(userid) over() * 100 per from tb t)
     group by userid
     order by count(1) desc, abs(max(per) - 3)
      

  10.   

    我实在愚昧,既然他们按事务数排序相同,导致不能及时合计
    那么再加一个排序字段:用户id即可了11楼的RATIO_TO_REPORT 函数我再看看,没接触过