现有一表,两个字段为:用户id,事务id,用户id会有重复,事务id不会重复,代表一个用户可以有多个事务
总计记录数约100万条
现欲取得一个用户列表
要求为:
1.这些用户的事务数是最多的那批人
2.这些用户的事务数合计是总事务数的3%当然,这些事务数的合计可能不会正好是总数的3%,取比较接近的就行了,多一点少一点都可以
总计记录数约100万条
现欲取得一个用户列表
要求为:
1.这些用户的事务数是最多的那批人
2.这些用户的事务数合计是总事务数的3%当然,这些事务数的合计可能不会正好是总数的3%,取比较接近的就行了,多一点少一点都可以
解决方案 »
- 怎么用JSP+js+oracle数据库实现下来三联动
- 怎么获取数据库没提交的所有sql
- 2个表联合查询的时候,如何利用索引,请教大家了!!!!!!!
- 急! 求大神 关于恢复PLSQL文件
- 怎样把oracel中的库导入到另外一台机器的oracel数据库?
- oralce 表的字段数有没有限制的?
- 请教:8i到9i迁移,涉及表分区,表空转换,数据量大,急!
- oracle9安装问题运行 runinstall 出现cannot execute binary file ?
- 如何登陆数据库?我安装时没有叫我输入用户名和密码啊!!我刚接触Oracle~~!
- 多级集合无法创建问题,求救
- oracle 8i的树的查询 求助
- SQL问题,麻烦大家指点下谢谢
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);
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
我只要一个用户列表,同时满足1,2两个条件
一般来讲,本表中每个用户的事务数最多有几百,不会出现一个用户的事务已经达到总数的3%这样的情况也就是说先把count(事务id)排序,取前面的一批人,他们的事务数总数是总数的3%,约3万
我们只能假设就是 前 10 名或不少于 3%。1 或 2 取 union 并集。
求此用户集合我现在只会用用户id guoup 然后用excel去加...
[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]
刚好我自己在用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
不知道有没有其他的办法来解决这个问题
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)
那么再加一个排序字段:用户id即可了11楼的RATIO_TO_REPORT 函数我再看看,没接触过