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...