簡體   English   中英

從具有一組日期的緩慢變化的表中選擇記錄

[英]Selecting records from slowly changing table with a set of dates

我有一個緩慢變化的表,每次更改任何源字段時都會創建一個新行。 添加了一些元數據以顯示該版本何時有效。 這是一個簡化的示例(日期為 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

我可以看到如何使用 cursor 執行此操作,逐步將每個日期放入變量中並使用類似

select @date, [unique id], serial_number
from example
where @date between start_date and end_date

獲取行。

我無法制定出一種以基於集合的方法進行的模式。 我首選的 SQL 版本是 TSQL。 抱歉,這幾乎可以肯定是重復的,但我找不到能打出有效示例的單詞形式。

您可以使用臨時表來完成此操作。

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

您可以在需要的日期加入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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM