問題:根據以下內容回傳單個結果集
對于報告表 (rdate) 中的每個日期,回傳早于或等于 rdate(加上 t1 & t2)的最新交易表 (tdate) 作為 sdate,s1,s2
對于報告表 (rdate) 中的每個日期,將晚于或等于 rdate(加上 t1 & t2)的最早交易表 (tdate) 回傳為 edate,e1,e2
嘗試過 TOP 1 / APPLY / LEAD& LAG 代碼,但無法獲得所需的結果。
任何建議表示贊賞。謝謝
報告表
| 日期 |
|---|
| 06/01/2021 |
| 26/01/2021 |
| 15/02/2021 |
交易表
| 日期 | t1 | t2 |
|---|---|---|
| 01/01/2021 | 17 | 6 |
| 05/01/2021 | 5 | 9 |
| 09/01/2021 | 8 | 12 |
| 19/01/2021 | 15 | 11 |
| 20/01/2021 | 12 | 8 |
| 25/01/2021 | 9 | 1 |
| 26/01/2021 | 8 | 17 |
| 30/01/2021 | 7 | 6 |
| 08/02/2021 | 6 | 21 |
| 22/02/2021 | 14 | 5 |
| 27/02/2021 | 11 | 4 |
需要結果
| 日期 | 日期 | s1 | s2 | 日期 | e1 | e2 |
|---|---|---|---|---|---|---|
| 06/01/2021 | 05/01/2021 | 5 | 9 | 09/01/2021 | 8 | 12 |
| 26/01/2021 | 26/01/2021 | 8 | 17 | 26/01/2021 | 8 | 17 |
| 15/02/2021 | 08/02/2021 | 6 | 21 | 22/02/2021 | 14 | 5 |
uj5u.com熱心網友回復:
A CROSS APPLYorOUTER APPLY與SELECT TOP 1具有適當順序和過濾條件的a一起應該可以解決問題。嘗試:
DECLARE @ReportTable TABLE (rdate DATETIME)
INSERT @ReportTable
VALUES
('2021-01-06'),
('2021-01-26'),
('2021-02-15')
DECLARE @TransactionTable TABLE (tdate DATETIME, t1 INT, t2 INT)
INSERT @TransactionTable
VALUES
('2021-01-01', 17, 6),
('2021-01-05', 5, 9),
('2021-01-09', 8, 12),
('2021-01-19', 15, 11),
('2021-01-20', 12, 8),
('2021-01-25', 9, 1),
('2021-01-26', 8, 17),
('2021-01-30', 7, 6),
('2021-02-08', 6, 21),
('2021-02-22', 14, 5),
('2021-02-27', 11, 4)
SELECT * -- TODO: Assign meaningful names here
FROM @ReportTable R
OUTER APPLY (
SELECT TOP 1 *
FROM @TransactionTable T1
WHERE T1.tdate <= R.rdate
ORDER BY T1.tdate DESC
) S
OUTER APPLY (
SELECT TOP 1 *
FROM @TransactionTable T2
WHERE T2.tdate >= R.rdate
ORDER BY T2.tdate
) E
ORDER BY R.rdate
該OUTER APPLY就像是LEFT JOIN等價的CROSS APPLY,允許沒有找到記錄。仔細查看不等式條件以確保邊緣情況符合預期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/341127.html
下一篇:如何合并行中的兩列?
