在日期范围和返回值中查找匹配值

时间:2018-06-15 11:59:00

标签: sql sql-server tsql

我正在寻找一个解决方案,我希望找到在特定时间范围内有效的价格,并将结果插入到交易表中。 价格表在更新价格时只有一个日期戳,价格变化会创建一个带有新日期的新行。

我已将两个表连接在一起,但我的尝试只会导致创建多个额外的行。

 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

SQL Fiddle

3 个答案:

答案 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