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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!