SqlServer分組排序取出每組順序第一的資料

2021-09-05 10:50:40 字數 2563 閱讀 8708

首先建立測試表並插入資料,

--建立測試表(匯率庫表)

create

table exchangerate(

moneytype varchar

(100),

--幣種

exchangerate varchar

(100),

--匯率

adddate datetime

--新增時間);

--插入測試資料

insert

into exchangerate values

('美元'

,'6.17'

,'2018-09-11 12:30:53.283');

insert

into exchangerate values

('美元'

,'6.36'

,'2018-10-01 10:00:00.000');

insert

into exchangerate values

('英鎊'

,'8.74'

,'2018-10-15 11:00:00.000');

insert

into exchangerate values

('英鎊'

,'8.53'

,'2018-11-16 12:00:00.000');

insert

into exchangerate values

('港元'

,'0.87'

,'2018-08-01 11:00:00.000');

insert

into exchangerate values

('港元'

,'0.79'

,'2018-10-10 12:00:00.000'

);

匯率庫表如下:

我想要得到資料為,每個幣種下最新日期的匯率,效果圖如下:

要實現這樣的效果我有兩條思路,一是按照幣種分組後,取日期最大的所有資料。sql如下:

select

*from exchangerate ss1

inner

join

(select

max(adddate)

as adddate, moneytype from exchangerate group

by moneytype) ss2

on ss1.adddate=ss2.adddate and ss1.moneytype=ss2.moneytype

效果圖如下:

雖然達到了想要的效果,但是在實際專案中,我覺得通過adddate和moneytype兩列不一定能保證資料唯一性,我也不清楚這種寫法有什麼缺陷,但總感覺怪怪的,所以實際中我沒有採用這種寫法。下面是第二個思路:

按照幣種分組,且按照日期降序排序,取出每組中的序號為1的所有資料。sql如下:

select

*from

(select

*,row_number(

)over

(partition

by moneytype order

by adddate desc

) rn from exchangerate

) tn where tn.rn=

1;

效果圖如下:

sql中用到了over()函式,這是開窗函式,與聚合函式一樣,開窗函式也是對行集組進行聚合計算,但是它不像普通聚合函式那樣每組只返回乙個值,開窗函式可以為每組返回多個值,因為開窗函式所執行聚合計算的行集組是視窗。在 iso sql 規定了這樣的函式為開窗函式,在 oracle 中則被稱為分析函式。

over()函式很重要,在sqlserver中的分頁方法有很多,其中top not in方式是最常用的,而使用row_number() over()函式是最好的解決分頁的方法,舉例如下:

-- 匯率庫表.分頁查詢,查詢第6頁的資料,每頁2條

select

*from

(select

*,row_number(

)over

(order

by adddate)

as rowid from exchangerate

)as b

where rowid between(6

-1)*

2+1and6*

2

在解決問題中,從網上參考了很多資料,參考鏈結如下:

記錄 T SQL 分組排序中取出最新資料

原文 記錄 t sql 分組排序中取出最新資料 示例 product 表結構 示例 product 表資料 想要的效果是,以 groupname 字段分組,取出分組中通過 sort 降序最新的資料,通過示例資料,可以推算出結果資料的 id 應該為 7 5 3。示例 sql select from p...

記錄 T SQL 分組排序中取出最新資料

示例 product 表結構 示例 product 表資料 想要的效果是,以 groupname 字段分組,取出分組中通過 sort 降序最新的資料,通過示例資料,可以推算出結果資料的 id 應該為 7 5 3。示例 sql select from product p where id select...

SQL server 分組後每組取出任意一行

資料來源 insert into dbo dept id code name values n 1 n hex 1 n 張三 gogo insert into dbo dept id code name values n 2 n hex 2 n lisi gogo insert into dbo d...