如何解决用于填充缺失值的 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
这很好用;然而,鉴于实际用例要复杂得多,我很好奇是否有更好的方法来实现预期的结果。性能是我最关心的问题......似乎我应该能够结合交叉申请和加入步骤,但是我对交叉申请仍然有点陌生。
解决方法
用所有可能的城市/日期组合创建一个投影,然后加入:
WITH Projection AS (
SELECT City,[Date]
FROM Dates
CROSS JOIN (SELECT DISTINCT City FROM Records) c
)
SELECT p.*,coalesce(r.[Value],0.0) as [Value]
FROM Projection p
LEFT JOIN #Records r ON r.[Date] = p.[Date] AND r.City = p.City
ORDER BY [Date],City
在这里看到它的工作:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。