日期:2014-05-17  浏览次数:20802 次

oracle 再次请教各位个sql语句,万分感谢
表table,以下是表里的数据
member_id user_id
0001 11
0001 12
0001 13
0001 14
0002 21
0002 22
0002 23
0002 11
0004 41
0004 42
0004 43
0004 44
0004 22
0005 51

我现在想要查询出每个member_id只显示前两行数据

查询后的结果
member_id user_id
0001 11
0001 12
0002 21
0002 22
0004 41
0004 42
0005 51

select * from (select t.*,rank() over(partition by t.member_id order by t.user_id)tmpe from table t) where tmpe >2
我想把查出来的数据给删掉,怎么写,,,,,,,,,就是每个member_id下会有很多个user_id,,但是我只要每个member_id下只留2个user_id

------解决方案--------------------
把test_yixl 换成你自己的表名即可:
SQL code
delete from test_yixl main
where (main.member_id, main.user_id) in (select sub.member_id, sub.user_id 
from  (select t.member_id member_id , t.user_id user_id,
              rank() over(partition by t.member_id order by t.user_id) temp 
         from test_yixl t ) sub 
       where sub.temp >2)

------解决方案--------------------
SQL code
delete from table where rowid in(
select rowid from(
select rowid,
row_number() over(partition by member_id order by user_id) rn 
from table 
where rn>2))