我有一个缓慢变化的表,每次更改任何源字段时都会创建一个新行。添加了一些元数据以显示该版本何时有效。这是一个简化的示例(日期为 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 | 2/8/2021 | 0 | 17 | 2345 |
28/4/2021 | 28/6/2021 | 0 | 18 | 4567 |
23/5/2021 | 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 |
2021 年 15 月 10 日 | 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 |
2021 年 7 月 15 日 | 9999 年 12 月 31 日 | 1 | 29 | 7891 |
22/11/2021 | 9999 年 12 月 31 日 | 1 | 30 | 5678 |
26/11/2021 | 9999 年 12 月 31 日 | 1 | 31 | 6789 |
2021 年 15 月 6 日 | 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 |
15/3/2021 | 7 | 1234 |
15/3/2021 | 9 | 3456 |
15/3/2021 | 10 | 4567 |
15/3/2021 | 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。抱歉,这几乎可以肯定是重复的,但我找不到能打出有效示例的单词形式。