我有一個緩慢變化的表,每次更改任何源欄位時都會創建一個新行。添加了一些元資料以顯示該版本何時有效。這是一個簡化的示例(日期為 dd/mm/yyyy 格式),它不顯示已更改的欄位。
| 開始日期 | 結束日期 | 當前記錄 | 唯一身份 | 序列號 |
|---|---|---|---|---|
| 2020 年 15 月 12 日 | 2020 年 12 月 31 日 | 0 | 1 | 2345 |
| 2020 年 15 月 12 日 | 2021 年 8 月 3 日 | 0 | 2 | 1234 |
| 2020 年 9 月 19 日 | 15/2/2021 | 0 | 3 | 2345 |
| 2020 年 15 月 12 日 | 2021 年 8 月 3 日 | 0 | 4 | 3456 |
| 2021 年 9 月 3 日 | 2021 年 10 月 3 日 | 0 | 5 | 3456 |
| 16/2/2021 | 2021 年 10 月 3 日 | 0 | 6 | 2345 |
| 2021 年 9 月 3 日 | 26/3/2021 | 0 | 7 | 1234 |
| 27/3/2021 | 2021 年 2 月 5 日 | 0 | 8 | 1234 |
| 2021 年 11 月 3 日 | 2021 年 5 月 17 日 | 0 | 9 | 3456 |
| 2021 年 3 月 3 日 | 27/4/2021 | 0 | 10 | 4567 |
| 20/1/2021 | 2021 年 7 月 4 日 | 0 | 11 | 5678 |
| 2021 年 3 月 5 日 | 2021 年 6 月 30 日 | 1 | 12 | 1234 |
| 25/5/2021 | 2021 年 5 月 31 日 | 0 | 13 | 2345 |
| 2021 年 8 月 4 日 | 22/5/2021 | 0 | 14 | 5678 |
| 2021 年 1 月 6 日 | 26/6/2021 | 0 | 15 | 2345 |
| 2021 年 5 月 18 日 | 2021 年 3 月 6 日 | 0 | 16 | 3456 |
| 27/6/2021 | 2021 年 2 月 8 日 | 0 | 17 | 2345 |
| 28/4/2021 | 28/6/2021 | 0 | 18 | 4567 |
| 2021 年 5 月 23 日 | 2021 年 6 月 9 日 | 0 | 19 | 5678 |
| 2021 年 4 月 6 日 | 28/6/2021 | 0 | 20 | 3456 |
| 2021 年 6 月 29 日 | 25/7/2021 | 0 | 21 | 3456 |
| 2021 年 3 月 8 日 | 9999 年 12 月 31 日 | 1 | 22 | 2345 |
| 26/7/2021 | 9999 年 12 月 31 日 | 1 | 23 | 3456 |
| 15/10/2021 | 9999 年 12 月 31 日 | 1 | 24 | 4567 |
| 2021 年 7 月 9 日 | 2021 年 1 月 11 日 | 0 | 25 | 5678 |
| 22/9/2021 | 2021 年 10 月 11 日 | 0 | 26 | 6789 |
| 2021 年 2 月 11 日 | 2021 年 11 月 16 日 | 0 | 27 | 5678 |
| 2021 年 11 月 17 日 | 21/11/2021 | 0 | 28 | 5678 |
| 15/7/2021 | 9999 年 12 月 31 日 | 1 | 29 | 7891 |
| 22/11/2021 | 9999 年 12 月 31 日 | 1 | 30 | 5678 |
| 26/11/2021 | 9999 年 12 月 31 日 | 1 | 31 | 6789 |
| 15/6/2021 | 9999 年 12 月 31 日 | 1 | 32 | 8912 |
對于任何給定的時間點,每個序列號只有一條記錄(即,相同序列號的日期范圍不會重疊),但某些序列號的劇集之間可能存在間隔(表示在服務間隔后離開和回傳的東西)。
我想提供任意日期時間串列,例如 2021 年 1 月 1 日、2021 年 3 月 15 日、2021 年 5 月 27 日午夜。2021 年 10 月 23 日。我想回傳一組記錄,其中包含在每個日期有效的每條記錄,每一行都標有它被選中的日期。所以上面的例子應該回傳這個。
| 日期 | 唯一身份 | 序列號 |
|---|---|---|
| 2021 年 1 月 1 日 | 2 | 1234 |
| 2021 年 1 月 1 日 | 3 | 2345 |
| 2021 年 1 月 1 日 | 4 | 3456 |
| 2021 年 15 月 3 日 | 7 | 1234 |
| 2021 年 15 月 3 日 | 9 | 3456 |
| 2021 年 15 月 3 日 | 10 | 4567 |
| 2021 年 15 月 3 日 | 11 | 5678 |
| 27/5/2021 | 12 | 1234 |
| 27/5/2021 | 13 | 2345 |
| 27/5/2021 | 16 | 3456 |
| 27/5/2021 | 18 | 4567 |
| 27/5/2021 | 19 | 5678 |
| 2021 年 10 月 23 日 | 22 | 2345 |
| 2021 年 10 月 23 日 | 23 | 3456 |
| 2021 年 10 月 23 日 | 24 | 4567 |
| 2021 年 10 月 23 日 | 25 | 5678 |
| 2021 年 10 月 23 日 | 26 | 6789 |
| 2021 年 10 月 23 日 | 29 | 7891 |
| 2021 年 10 月 23 日 | 32 | 8912 |
我可以看到如何使用游標執行此操作,逐步將每個日期放入變數中并使用類似
select @date, [unique id], serial_number
from example
where @date between start_date and end_date
獲取行。
我無法制定出一種以基于集合的方法進行的模式。我首選的 SQL 版本是 TSQL。抱歉,這幾乎可以肯定是重復的,但我找不到能打出有效示例的單詞形式。
uj5u.com熱心網友回復:
您可以使用臨時表來完成此操作。
CREATE TABLE #RequestedDates([Date] DATE)
您將所需的日期插入到臨時表中。
INSERT INTO #RequestedDates([Date])
VALUES ('2021-01-01'), ('2021-03-15') /*Other dates*/
然后加入臨時表并使用 between 子句獲得有效結果。
SELECT rd.[Date]
, t.UniqueId
, t.SerialNumber
FROM MyTable t
INNER JOIN #RequestedDates rd on rd.[Date] BETWEEN t.StartDate AND t.EndDate
ORDER BY rd.[Date]
, t.UniqueId
, t.SerialNumber
uj5u.com熱心網友回復:
您可以加入VALUES您需要的日期。
然后加入范圍內的日期時間。
SELECT
datetimes.dt as [date]
, t.[unique id]
, t.serial_number
FROM example t
JOIN (VALUES
(cast('2021-01-01 00:00:00' as datetime)),
('2021-03-15 00:00:00'),
('2021-05-27 00:00:00'),
('2021-10-23 00:00:00')
) datetimes(dt)
ON datetimes.dt >= t.start_date
AND datetimes.dt <= t.end_date
ORDER BY datetimes.dt, t.[unique id], t.serial_number
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410556.html
標籤:
