问题描述
我有一个历史数据表(#Records);在 sproc 结束时,我需要根据日期表 (dbo.MasterDates
) 填充数据。对于以下简化示例,我将简单地使用 City 作为唯一数据系列的标识符。
tempdb.dbo.#Records:
日期 | 城市 | 价值 |
---|---|---|
2021-06-04 | 洛杉矶 | 10.5 |
2021-06-04 | 纽约 | 11.2 |
2021-06-05 | 洛杉矶 | 9.2 |
2021-06-06 | 纽约 | 8.1 |
dbo.Dates:
日期 | 年 | 月 | 日 |
---|---|---|---|
2021-06-04 | 2021 | 6 | 4 |
2021-06-05 | 2021 | 6 | 5 |
2021-06-06 | 2021 | 6 | 6 |
如果数据被过滤,因此只有一个系列被检索(即,只有纽约的数据),填充将是从 dbo.Dates 和#Records 上的 left outer join
。但是,我需要填写这样的内容,以便每个独特城市的每一天都有记录。
例如(填充记录粗体)
日期 | 城市 | 价值 |
---|---|---|
2021-06-04 | 洛杉矶 | 10.5 |
2021-06-04 | 纽约 | 11.2 |
2021-06-05 | 洛杉矶 | 9.2 |
2021-06-05 | 纽约 | 0.0 |
2021-06-06 | 洛杉矶 | 0.0 |
2021-06-06 | 纽约 | 8.1 |
我的第一次尝试是创建一个带有每个唯一城市记录的 dbo.Dates 版本,然后使用它来填充 #Records 表: >
insert into #FilledDates (Date,City)
select
dates.Date,City
from Dates d
cross apply
(
select distinct City from #Records
) r
select
d.Date,d.City,isnull(r.Value,0)
from #FilledDates d
left outer join #Records r on r.Date = d.Date and r.City = d.City
这很好用;然而,鉴于实际用例要复杂得多,我很好奇是否有更好的方法来实现预期的结果。性能是我最关心的问题......似乎我应该能够结合交叉申请和加入步骤,但是我对交叉申请仍然有点陌生。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)