SQL如何对分组后的结果进行排序并且取前几名

SQL如何对分组后的结果进行排序并且取前几名,第1张

SQL取分组中的前几名

[sql] >sql语句截取字符串前几位语句:
select
substr(cont_no,1,9)
from
for_contract
SUBSTRING
(
expression
,
start
,
length
)
expression:是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。
start:是一个整数,指定子串的开始位置。
length:是一个整数,指定子串的长度(要返回的字符数或字节数)。
eg:select
id
from
users
id的值是001002$
select
substring(ID,charindex('',ID)+1,(charindex('$',ID)-charindex('',ID)-1))
as
idx

select BB科目,BBrk,BB姓名,BB分数
from (select B,
rank() over(partition by B科目 order by B分数 desc) rk
from B )BB
where BBrk < 4;
oracle 10g 已经测试。

可以用row_number函数来解决。

1、创建测试表,插入数据:

create table sc
(id int,
name varchar(20),
class varchar(20),
score int);
insert into sc values (1,'badkano','一年一班',100)
insert into sc values (2,'百度知道团长','一年一班',99)
insert into sc values (3,'du小短','一年一班',95)
insert into sc values (4,'du小小动','一年一班',97)
insert into sc values (5,'du小智','一年一班',80)
insert into sc values (6,'吕布','一年二班',67)
insert into sc values (7,'赵云','一年二班',90)
insert into sc values (8,'典韦','一年二班',89)
insert into sc values (9,'关羽','一年二班',70)
insert into sc values (10,'马超','一年二班',98)

2、查询每个班级的前三名,可用语句:

select  from
(select row_number() over (partition by class order by score desc) 排名, from sc) t
where 排名<=3 order by class asc,score desc

3、结果截图:

With A

As

(

Select distinct a,1 as cnt From T

union all

Select a,cnt+1 as cnt From A where cnt<10

)

Select Ba,BB,BC From A Left Join

(

Select row_number() over(partition by a order  by b) as cnt, from T

) B on ACnt=BCnt Where BCnt Is Not Null

/

按标志分别产生10条记录和记录号(A)

把T表按标志分组,身高排序产生记录号(B)

把AB做链接

/


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13325447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-15
下一篇 2023-07-15

发表评论

登录后才能评论

评论列表(0条)

保存