您好我是 sql 的新手,所以需要幫助查找 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 的最新貨幣匯率。在任何給定日期,只有任何特定貨幣的匯率
如此預期的輸出
| ID | 基線 | 電流 | 速度 | 日期 |
|---|---|---|---|---|
| 2個 | 印度盧比 | 美元 | 82 | 2022-11-08 |
| 4個 | 印度盧比 | 計算機輔助設計 | 56 | 2022-11-05 |
| 5個 | 印度盧比 | 擦 | .74 | 2022-11-04 |
輸出說明:
ID 1,6 被拒絕:因為它們大于 2022-11-09 日期
Id 3 被拒絕,因為我們在第 2 行中還有一條 INR 到 CAD 的記錄,而且它的日期對 Id 3 來說更新
uj5u.com熱心網友回復:
您可以使用視窗函式,例如DENSE_RANK()如果資料庫版本是8.0 為了通過使用下面的查詢來確定最新記錄
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
但是,請注意,此查詢也會回傳關系(相等的日期值),如果有的話。
Demo
uj5u.com熱心網友回復:
除了為此使用視窗函式的選項之外,您還可以使用子查詢。在子查詢中,您將捕獲具有最新日期的每種貨幣:
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 |
要指出這一點:我認為如果可能的話,應該首選使用視窗函式。
他們只是有“缺點”,舊的資料庫不提供它們,而且它們通常因資料庫型別而異。
因此,如果需要一個始終適用于每種資料庫型別和資料庫版本的查詢,則這種使用子查詢的方式會很有幫助。
uj5u.com熱心網友回復:
您可以使用子查詢獲取所需的輸出,如下所示,它從每種貨幣獲取最新記錄。
-- 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');
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537425.html
標籤:数据库数据库mysqli
