oracle中,每种类型的数据,各取10行(随意取),该如何写语句呢,多谢

yigenanren1222 2012-09-26 09:41:30
大家好,请教个问题。现在oracle中,有一张表,结构大概如下:
公司名,人名,。。。。。。。
A 甲1
A 甲2
.。。。。。
A 甲178
A 甲179
B 乙1
B 乙2
.。。。。。
B 乙98
B 乙99
C 丙1
C 丙2
.。。。。。
C 丙211
C 丙212

现在想每个公司,各取10个本公司的员工,请问怎么写这语句呢?多谢
...全文
642 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lookat800 2012-10-02
  • 打赏
  • 举报
回复
-------RANK DENSERANK ROW_NUMBER区别
select empnum, dept, salary,
rank() over (partition by dept order by salary desc nulls last) as rank,
dense_rank() over (partition by dept order by salary desc nulls last)as denserank,
row_number() over (partition by dept order by salary desc nulls last)as rownumber
from emptab;

EMPNUM DEPT SALARY RANK DENSERANK ROWNUMBER
------ ---- ------ ---- --------- ---------
6 1 78000 1 1 1
2 1 75000 2 2 2
7 1 75000 2 2 3
11 1 53000 4 3 4
5 1 52000 5 4 5
1 1 50000 6 5 6
--------------------------------------------------
9 2 51000 1 1 1
4 2 - 2 2 2
winer1220 2012-09-29
  • 打赏
  • 举报
回复
row_number就可以
winer1220 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
举个例子:


SQL code


with t1 as
(
select 'A' t_name,'甲1' p_name from dual
union all
select 'A' t_name,'甲2' p_name from dual
union all
select 'A' t_name,'甲2' p_name ……
[/Quote]

更严谨的回答
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:

select *
from (select t.*,rank() over(partition by t.公司名 order by t.人名) rn
from t
)
where rn<=10


使用函数的时候 要先了解清楚函数

rank() over()是跳数排序 如果刚好第10个11个名称相同呢 那这样取出来的值 至少有11行记录……
[/Quote]
学习了,++++++
陈字文 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:

select *
from (select t.*,rank() over(partition by t.公司名 order by t.人名) rn
from t
)
where rn<=10


使用函数的时候 要先了解清楚函数

rank() over()是跳数排序 如果刚好第10个11个名称相同呢 那这样取出来的值 至少有11行记录……
[/Quote]


++ 学习了,这个确实是这样子的,谢谢分享
DXX627YERUI 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
select *
from (select t.*,row_number() over(partition by t.公司名 order by 1) rn
from t
)
where rn<=10
;
[/Quote]

+++
  • 打赏
  • 举报
回复
举个例子:


with t1 as
(
select 'A' t_name,'甲1' p_name from dual
union all
select 'A' t_name,'甲2' p_name from dual
union all
select 'A' t_name,'甲2' p_name from dual
union all
select 'A' t_name,'甲2' p_name from dual
union all
select 'A' t_name,'甲3' p_name from dual
)

select *
from (
select t_name,rank() over(partition by t_name order by p_name) rk
from t1)
where rk <= 2

t_name rk
--------------------
1 A 1
2 A 2
3 A 2
4 A 2




  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

select *
from (select t.*,rank() over(partition by t.公司名 order by t.人名) rn
from t
)
where rn<=10
[/Quote]

使用函数的时候 要先了解清楚函数

rank() over()是跳数排序 如果刚好第10个11个名称相同呢 那这样取出来的值 至少有11行记录了
  • 打赏
  • 举报
回复
row_number() over()排序就可以了


with t1 as
(
select 'A' t_name,'甲1' p_name from dual
union all
select 'A' t_name,'甲2' p_name from dual
union all
select 'A' t_name,'甲3' p_name from dual
union all
select 'B' t_name,'乙1' p_name from dual
union all
select 'B' t_name,'乙3' p_name from dual
union all
select 'B' t_name,'乙22' p_name from dual
)

select t_name,p_name
from
(
select t_name,p_name,
row_number() over(partition by t_name order by p_name) rn
from t1
)
where rn <= 2

t_name p_name
-------------------------
1 A 甲1
2 A 甲2
3 B 乙1
4 B 乙22

陈字文 2012-09-27
  • 打赏
  • 举报
回复
select *
from (select t.*,rank() over(partition by t.公司名 order by t.人名) rn
from t
)
where rn<=10
feeling00700 2012-09-26
  • 打赏
  • 举报
回复
新人报到,怎么快速增加自己的积分呀
虫洞 2012-09-26
  • 打赏
  • 举报
回复
select *
from (select t.*,row_number() over(partition by t.公司名 order by 1) rn
from t
)
where rn<=10
;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧