我有下表“費率”:
| 一個約會 | 實際匯率 | 是作業日 |
|---|---|---|
| 01-04-22 | 1.10 | 1 |
| 02-04-22 | 1.20 | 1 |
| 03-04-22 | 1.30 | 1 |
| 04-04-22 | 1.40 | 0 |
| 05-04-22 | 1.50 | 0 |
| 06-04-22 | 1.60 | 1 |
| 07-04-22 | 1.70 | 1 |
| 08-04-22 | 1.80 | 1 |
| 09-04-22 | 1.90 | 1 |
| 10-04-22 | 2.00 | 0 |
| 11-04-22 | 2.10 | 0 |
| 12-04-22 | 2.20 | 0 |
| 13-04-22 | 2.30 | 0 |
| 14-04-22 | 2.40 | 1 |
| 15-04-22 | 2.50 | 1 |
| 16-04-22 | 2.60 | 1 |
| 17-04-22 | 2.70 | 1 |
| 18-04-22 | 2.80 | 0 |
| 19-04-22 | 2.90 | 0 |
| 20-04-22 | 3.00 | 0 |
| 21-04-22 | 3.10 | 1 |
我需要構建一個查詢,該查詢將在非作業日回傳前一個已知作業日的費率。列“useThisRate”是查詢的必需結果:
| 一個約會 | 實際匯率 | 是作業日 | 使用ThisRate |
|---|---|---|---|
| 01-04-22 | 1.10 | 1 | 1.10 |
| 02-04-22 | 1.20 | 1 | 1.20 |
| 03-04-22 | 1.30 | 1 | 1.30 |
| 04-04-22 | 1.40 | 0 | 1.30 |
| 05-04-22 | 1.50 | 0 | 1.30 |
| 06-04-22 | 1.60 | 1 | 1.60 |
| 07-04-22 | 1.70 | 1 | 1.70 |
| 08-04-22 | 1.80 | 1 | 1.80 |
| 09-04-22 | 1.90 | 1 | 1.90 |
| 10-04-22 | 2.00 | 0 | 1.90 |
| 11-04-22 | 2.10 | 0 | 1.90 |
| 12-04-22 | 2.20 | 0 | 1.90 |
| 13-04-22 | 2.30 | 0 | 1.90 |
| 14-04-22 | 2.40 | 1 | 2.40 |
| 15-04-22 | 2.50 | 1 | 2.50 |
| 16-04-22 | 2.60 | 1 | 2.60 |
| 17-04-22 | 2.70 | 1 | 2.70 |
| 18-04-22 | 2.80 | 0 | 2.70 |
| 19-04-22 | 2.90 | 0 | 2.70 |
| 20-04-22 | 3.00 | 0 | 2.70 |
| 21-04-22 | 3.10 | 1 | 3.10 |
請注意,連續的非作業日天數未知。
任何幫助將不勝感激。
uj5u.com熱心網友回復:
可能最直觀的方式是關聯查詢。
您要么想要 realRate,要么如果非作業日,則需要最近的 realRate,它是一個作業日,并且日期早于當前行。
select *,
case when isBusinessDay = 1 then realrate
else (
select top(1) realrate
from rates r2
where r2.isBusinessDay = 1 and r2.aDate < r.adate
order by adate desc
)
end UseThisRate
from rates r;
uj5u.com熱心網友回復:
您可以進行一些自聯接和嵌入式子查詢以使其作業。我沒有方便訪問的 SQL 服務器,但查詢如下所示。
SELECT aDate, realRate
FROM Rates
WHERE IsBusinessDay = 1
UNION ALL
SELECT sub.aDate, r3.realRate
FROM Rates r3
INNER JOIN (
SELECT r1.aDate,
(SELECT MAX(aDate)
FROM Rates r2
WHERE r2.aDate < r1.aDate
AND r2.isBusinessDay = 1) as LastDate
FROM Rates r1
WHERE r1.IsBusinessDay = 0
) sub
ON r3.aDate = sub.LastDate
基本上:
- 將所有作業日(第一次查詢)添加到所有非作業日。對于那些:
- 對于每個非作業日,嵌入子查詢以獲取小于非作業日的作業日的 MAX()。
- 然后加入實際表以獲取該作業日的費率。
請注意,如果表中的行數非常大,那么這樣的嵌入式查詢可能會很昂貴,但是由于您似乎每天只有 1 行,因此您不應該有數百萬行。原因是因為它使用 r1 表作為過濾條件,服務器必須為 r1 中的每一行重新執行子查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/469063.html
