簡體   English   中英

查詢查找 sql 中的最新記錄

[英]Query for finding latest record in sql

給定一個貨幣表,我需要找到小於給定特定日期的最新轉換率記錄

輸入表結構如下:

ID 基線 電流 速度 日期
1個 印度盧比 美元 81 2022-11-09
2個 印度盧比 美元 82 2022-11-08
3個 印度盧比 美元 80 2022-11-06
4個 印度盧比 計算機輔助設計 56 2022-11-05
5個 印度盧比 .74 2022-11-04
6個 印度盧比 計算機輔助設計 57 2022-11-12

問題陳述:

我需要找到所有小於 2022-11-09 的最新貨幣匯率。在任何給定日期,只有任何特定貨幣的匯率

所以預計 output

ID 基線 電流 速度 日期
2個 印度盧比 美元 82 2022-11-08
4個 印度盧比 計算機輔助設計 56 2022-11-05
5個 印度盧比 .74 2022-11-04

output說明:

Id 1,6 被拒絕:因為它們大於 2022-11-09 日期

Id 3 被拒絕,因為我們在第 2 行中還有一條 INR 到 CAD 的記錄,而且它的日期對 Id 3 來說更新

如果數據庫版本為8.0+ ,則可以使用 window function 等DENSE_RANK()以便使用以下查詢確定最新記錄

WITH t AS
(
 SELECT t.*, DENSE_RANK() OVER (PARTITION BY baseCur, Curr ORDER BY date DESC) AS dr
   FROM t
  WHERE date < '2022-11-09' 
)
SELECT id, baseCur, Curr, rate, date
  FROM t
 WHERE dr = 1

但是,請注意,如果有的話,此查詢也會返回關系(相等的日期值)。

演示

除了為此使用 window function 的選項之外,您還可以使用子查詢。 在子查詢中,您將捕獲具有最新日期的每種貨幣:

SELECT 
curr, MAX(yourdate) maxDate
FROM yourtable
WHERE yourdate < '2022-11-09' 
GROUP BY curr; 

此查詢將產生以下結果:

電流 最大日期
2個 2022-11-08
4個 2022-11-05
5個 2022-11-04

可以通過從主查詢應用JOIN子句或IN子句來使用此結果。

這將添加其他列。

SELECT y.id, y.baseCur, y.curr, y.rate, y.yourdate
FROM yourtable y 
JOIN (SELECT 
curr, MAX(yourdate) maxDate
FROM yourtable
WHERE yourdate < '2022-11-09' 
GROUP BY curr) maxDates
ON y.curr = maxDates.curr 
AND y.yourdate = maxDates.maxDate
ORDER BY id;

因此,將創建完整的預期結果:

ID 基線 電流 速度 日期
2個 印度盧比 美元 82 2022-11-08
4個 印度盧比 計算機輔助設計 56 2022-11-05
5個 印度盧比 .74 2022-11-04

要指出這一點:我認為如果可能的話,應該首選使用 window function。

他們只是有“缺點”,舊的數據庫不提供它們,而且它們通常因數據庫類型而異。

因此,如果需要一個始終適用於每種數據庫類型和數據庫版本的查詢,則這種使用子查詢的方式會很有幫助。

您可以使用子查詢獲取所需的 output,如下所示,它從每種貨幣獲取最新記錄。

-- 1. Based on id column
SELECT * FROM sometable as t WHERE t.id = 
(SELECT MAX(id) FROM sometable WHERE Curr = t.Curr and date < '2022-11-09');
-- 2. Based on date column
SELECT * FROM sometable as t WHERE t.date = 
(SELECT MAX(date) FROM sometable WHERE Curr = t.Curr and date < '2022-11-09');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM