用于填充缺失值的 SQL 连接

问题描述

我有一个历史数据表(#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 (将#修改为@)