如果同一日期不可用,是否在前一个日期加入?
Join on previous date if same date is not available?
enter image description here
我想将余额 table 添加到每个 UID 和 stock_name 和日期的订单中。该日期应在相同或之前的可用日期加入。
这是我的初始代码,但如果日期在订购日期期间不可用,它将 return 为空。
Select a.date,
a.stock_name,
a.UID,
a.Sale,
b.avg_price,
a.Sale-b.avg_price as Gain
from orders as a
left join balance as b on a.UID = b.UID and a.stock_name = b.stock_name and a.date = b.date
order by a.date desc
我会为此使用 CROSS APPLY 或 OUTER APPLY (SELECT TOP 1 ...)。尝试:
outer apply (
select top 1 *
from balance as b
where a.UID = b.UID
and a.stock_name = b.stock_name
and a.date >= b.date
order by b.date desc
) b
这将 select 最接近的余额日期等于或早于订单日期。如果结果 b 为空,则没有余额记录。 OUTER APPLY 就像一个 LEFT OUTER JOIN,而 CROSS APPLY 就像一个普通的 INNER JOIN。您使用哪种取决于您喜欢如何处理不匹配情况。
enter image description here
我想将余额 table 添加到每个 UID 和 stock_name 和日期的订单中。该日期应在相同或之前的可用日期加入。
这是我的初始代码,但如果日期在订购日期期间不可用,它将 return 为空。
Select a.date,
a.stock_name,
a.UID,
a.Sale,
b.avg_price,
a.Sale-b.avg_price as Gain
from orders as a
left join balance as b on a.UID = b.UID and a.stock_name = b.stock_name and a.date = b.date
order by a.date desc
我会为此使用 CROSS APPLY 或 OUTER APPLY (SELECT TOP 1 ...)。尝试:
outer apply (
select top 1 *
from balance as b
where a.UID = b.UID
and a.stock_name = b.stock_name
and a.date >= b.date
order by b.date desc
) b
这将 select 最接近的余额日期等于或早于订单日期。如果结果 b 为空,则没有余额记录。 OUTER APPLY 就像一个 LEFT OUTER JOIN,而 CROSS APPLY 就像一个普通的 INNER JOIN。您使用哪种取决于您喜欢如何处理不匹配情况。