我正在寻找一个解决方案,我希望找到在特定时间范围内有效的价格,并将结果插入到交易表中。 价格表在更新价格时只有一个日期戳,价格变化会创建一个带有新日期的新行。
我已将两个表连接在一起,但我的尝试只会导致创建多个额外的行。
SELECT t.ID
,t.Date
,t.ArtNo
,t.SellPrice
,p.Price
FROM TRANS t
LEFT JOIN Price p ON p.ArtNo = t.ArtNo AND p.Date <=t.Date
期望的结果:
ID Date ArtNo SellPrice Price
1 17/08/2016 00:00:00 A1010 30 21.8
2 02/04/2017 00:00:00 A1010 31 21.8
3 01/03/2018 00:00:00 A1010 31 22.35
4 01/11/2016 00:00:00 B2000 5 4.1
5 30/05/2017 00:00:00 B2000 5 4.17
6 29/10/2017 00:00:00 B2000 5 4.17
答案 0 :(得分:3)
SELECT
t.ID
, t.Date
, t.ArtNo
, t.SellPrice
, pr.Price
FROM TRANS t
OUTER APPLY ( SELECT TOP (1) p.Price
FROM Price p
WHERE p.ArtNo = t.ArtNo
AND p.Date <=t.Date
ORDER BY p.Date DESC
) pr(Price)
答案 1 :(得分:1)
你应该使用CROSS APPLY来获得如下所需的结果
SELECT t.ID
,t.Date
,t.ArtNo
,t.SellPrice
,p.Price
FROM TRANS t
Cross apply
(
select *, r1=row_number() over (partition by ArtNo order by Date desc)
from Price P
where p.Date <=t.Date and p.ArtNo=t.ArtNo
)p
where p.r1 =1
答案 2 :(得分:1)
使用子查询尝试这个简单的查询:
select ID,
[Date],
ArtNo,
SellPrice,
(select Price from price p where p.ArtNo = t.ArtNo and p.[Date] = (select max([date]) from Price p2 where t.ArtNo = p2.ArtNo and p2.[Date] <= t.[Date])) [Price]
from TRANS t