如何解决其他表格中每个最近日期的SQL查找值
关于the solution to this question,相关子查询不会执行多次吗?你们能想到在大型数据集上可以执行得更好的任何其他查询吗?
不是通过结合使用带子查询的联接,而是利用 LAG / LEAD函数?我只是想知道..对于解决遇到类似问题的性能问题的任何投入或想法,我将不胜感激。.我一直在网上搜索并已经尝试过使用 row_number()
解决方法
另一种方法是使用横向联接:
select e.*,er.*
from entries e
outer apply (
select rate,valid_from
from exchange_rates er
where er.valid_from <= e.date
order by er.valid_from desc
offset 0 rows fetch next 1 row only
) er
此语法在Oracle和SQL Serer中都应该起作用,它们都已标记。 exchange_rate(valid_from,rate)
上的索引可能有助于加快查询速度。
ID | DATE | rate | valid_from -: | :--------- | ---: | :--------- 1 | 2020-01-02 | 101 | 2020-01-01 2 | 2020-01-03 | 103 | 2020-01-03 3 | 2020-01-04 | 104 | 2020-01-04 4 | 2020-01-08 | 105 | 2020-01-05,
我在Teradata上经常使用这种方法,在这种情况下,非等参联接不是很有效。
第一个UNION两个表都添加NULL:
select id,date,NULL as rate,NULL as valid_from
from ENTRIES
union all
select NULL as id,valid_from,rate,valid_from
from EXCHANGE_RATES
order by 2,1
id date rate valid_from
2020-01-01 101 2020-01-01
1 2020-01-02
2020-01-03 103 2020-01-03
2 2020-01-03
2020-01-04 104 2020-01-04
3 2020-01-04
2020-01-05 105 2020-01-05
4 2020-01-08
2020-01-09 109 2020-01-09
然后使用LAG填充丢失的数据:
with union_rows as
(
select id,NULL as valid_from
from ENTRIES
union all
select NULL as id,valid_from
from EXCHANGE_RATES
),fill_data as
(
select id,lag(rate,1,rate)
over (order by date,id) as rate,max(valid_from)
over (order by date,id
rows unbounded preceding) as valid_from
from union_rows
)
select *
from fill_data
id date rate valid_from
2020-01-01 101 2020-01-01
1 2020-01-02 101 2020-01-01
2 2020-01-03 2020-01-01
2020-01-03 2020-01-03
3 2020-01-04 103 2020-01-03
2020-01-04 2020-01-04
2020-01-05 104 2020-01-05
4 2020-01-08 105 2020-01-05
2020-01-09 2020-01-09
最后过滤掉ENTRIES中的行
where id is not null
只要每个日期/表只有一行,即行之间只有一个NULL,这将很好地工作。如果有多个NULL行,则需要LAG的IGNORE NULLS选项,SQL Server不支持该选项。
请参见fiddle
,您引用的问题是在八年前问的。
在任何情况下,当数据位于单个表中时,lag()
和lead()
都可以工作。这个问题是关于在另一个表中要求最接近的值。相关子查询是一种合理的方法。
还有其他方法-但这取决于特定的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。