SqlServer分組排序取出每組順序第一的數據


SqlServer分組排序取出每組順序第一的數據

https://blog.csdn.net/qq_32518631/article/details/85262662

首先創建測試表並插入數據,

--創建測試表(匯率庫表)
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');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
匯率庫表如下:

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

要實現這樣的效果我有兩條思路,一是按照幣種分組后,取日期最大的所有數據。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
1
2
3
效果圖如下:

雖然達到了想要的效果,但是在實際項目中,我覺得通過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;
1
2
3
效果圖如下:

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+1 and 6*2
1
2
3
4
5
在解決問題中,從網上參考了很多資料,參考鏈接如下:
https://blog.csdn.net/wulex/article/details/79288561
https://www.jb51.net/article/141174.htm
---------------------
作者:水瓶里的撒旦
來源:CSDN
原文:https://blog.csdn.net/qq_32518631/article/details/85262662
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM