首先建立測試表並插入資料,
匯率庫表如下:--建立測試表(匯率庫表)
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...