我想提供一個日期范圍的查詢,例如 11/01/2021 - 11/30/2021。從那里我想獲取屬于該日期范圍內的所有相關行,這非常簡單 - 只是一個簡單的選擇,帶有一個基于 to 和 from 日期的 where 子句。但在此之后,我想獲取日期范圍之前的最新行(如果存在),僅適用于出現在日期范圍內的外鍵 ID。
舉個例子,
| ID | 外幣ID | 日期 |
|---|---|---|
| 1 | 101 | 09/05/2021 |
| 2 | 101 | 10/29/2021 |
| 3 | 101 | 11/05/2021 |
| 4 | 201 | 11/20/2021 |
| 5 | 301 | 08/13/2021 |
| 6 | 401 | 11/01/2021 |
| 7 | 401 | 11/23/2021 |
如果我輸入 11/01/2021 - 11/30/2021 的日期范圍,我希望得到以下結果
| ID | 外幣ID | 日期 |
|---|---|---|
| 2 | 101 | 10/29/2021 |
| 3 | 101 | 11/05/2021 |
| 4 | 201 | 11/20/2021 |
| 6 | 401 | 11/01/2021 |
| 7 | 401 | 11/23/2021 |
我的第一個想法是聯合,其中第二個查詢獲取日期范圍之前的最大日期,并與第一個查詢合并,該查詢具有給定日期范圍內的所有值。但我認為這會因上表中的 ID 5 之類的值而失敗 - 因為對第二個查詢沒有限制,即它需要相同的 FK ID 才能存在于第一個表中。也許我只是沒有認真思考,但我想不出任何以這種方式限制工會的方法?
uj5u.com熱心網友回復:
您可以使用 cte 來選擇范圍內的行并添加相對于此 cte 的更多行
with cte as (
SELECT *
FROM tb
WHERE [Date] >= '11/1/2021' AND [Date] <= '11/30/2021'
)
select *
from cte
union all
select *
from (
select top(1) with ties *
from tb
where exists (select 1 from cte where cte.fk_id = tb.fk_id)
and [Date] < '11/1/2021'
order by row_number() over(partition by fk_id order by [date] desc)
) t
order by id;
資料庫<>小提琴
uj5u.com熱心網友回復:
以下查詢產生您想要的輸出
WITH cte AS(
SELECT ID,FK_ID,[DATE]
FROM tb
WHERE [DATe] >= '11/1/2021' AND [Date] <= '11/30/2021')
SELECT *
FROM cte
UNION ALL
SELECT ID,FK_ID,[DATE]
FROM
(SELECT *,
CASE WHEN LEAD([Date]) over(ORDER BY ID) >= '11/1/2021' AND LEAD([Date]) over(ORDER BY ID) <= '11/30/2021' THEN 1 ELSE 0 END AS rnk
FROM tb) t
WHERE rnk = 1 AND [DATe] < '11/1/2021' AND FK_ID IN (SELECT FK_ID FROM cte)
ORDER BY ID
db<>fiddle 中的演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/372098.html
標籤:sql sql-server
