sql server 分組後,取每組前1條資料

2021-07-29 14:42:59 字數 1464 閱讀 1371

sql 排名開窗函式 row_number、dense_rank、rank、ntile屬於排名函式。

排名開窗函式可以單獨使用order by 語句,也可以和partition by同時使用。

partition by用於將結果集進行分組,開窗函式應用於每一組。

oder by 指定排名開窗函式的順序。在排名開窗函式中必須使用order by語句

rank 跳過排名  dense_rank 繼續排名

create table tb_test(name varchar(10),val int,memo varchar(20)) 

insert into tb_test values('a', 2, 'a2(a的第二個值)')

insert into tb_test values('a', 1, 'a1--a的第乙個值')

insert into tb_test values('a', 3, 'a3:a的第三個值')

insert into tb_test values('b', 1, 'b1--b的第乙個值')

insert into tb_test values('b', 3, 'b3:b的第三個值')

insert into tb_test values('b', 2, 'b2b2b2b2')

insert into tb_test values('b', 4, 'b4b4')

insert into tb_test values('b', 5, 'b5b5b5b5b5')

insert into tb_test values('b', 5, 'bb5')

go--方案1

select a.* from tb_test a where not exists(select 1 from tb_test where name = a.name and val > a.val) ;

select a.* from tb_test a,(select name,max(val) val from tb_test group by name) b where a.name = b.name and a.val = b.val order by a.name;

select a.* from tb_test a inner join (select name , max(val) val from tb_test group by name) b on a.name = b.name and a.val = b.val order by a.name

--方案2 分組後 取每組前 2條資料

select * from (

select row_number()

over

(partition by name order by val) as rowid,tb_test.*

from tb_test

) twhere rowid <= 2

sql server 分組,取每組的前幾行資料

sql中group by後,獲取每組中的前n行資料,目前我知道的有2種方法 比如有個成績表 裡面有欄位學生id,科目,成績。我現在想取每個科目的頭三名。1.子查詢 select from score s where studentname in select top 3 studentname fr...

sql server 分組,取每組的前幾行資料

sql中group by後,獲取每組中的前n行資料,目前我知道的有2種方法 比如有個成績表 裡面有欄位學生id,科目,成績。我現在想取每個科目的頭三名。1.子查詢 select from score s where studentname in select top 3 studentname fr...

sql server 分組,取每組的前幾行資料

sql中group by後,獲取每組中的前n行資料,目前我知道的有2種方法 比如有個成績表 裡面有欄位學生id,科目,成績。我現在想取每個科目的頭三名。1.子查詢 select from score s where studentname in select top 3 studentname fr...