nwl*_*wly 6 sql t-sql sql-server date
我在MS SQL Server中有两个表:
dailyt - 包含每日数据:
date val
---------------------
2014-05-22 10
2014-05-21 9.5
2014-05-20 9
2014-05-19 8
2014-05-18 7.5
etc...
Run Code Online (Sandbox Code Playgroud)
并且periodt- 包含不定期的数据:
date val
---------------------
2014-05-21 2
2014-05-18 1
Run Code Online (Sandbox Code Playgroud)
给定一行dailyt,我想通过添加相应的值来调整其值,periodt最接近的日期先于或等于dailyt行的日期.所以,输出看起来像:
addt
date val
---------------------
2014-05-22 12 <- add 2 from 2014-05-21
2014-05-21 11.5 <- add 2 from 2014-05-21
2014-05-20 10 <- add 1 from 2014-05-18
2014-05-19 9 <- add 1 from 2014-05-18
2014-05-18 8.5 <- add 1 from 2014-05-18
Run Code Online (Sandbox Code Playgroud)
我知道这样做的一种方法是连接dailyt和periodt表格periodt.date <= dailyt.date然后强加一个ROW_NUMBER() (PARTITION BY dailyt.date ORDER BY periodt.date DESC)条件,然后WHERE在行号上加上条件= 1.
还有另一种方法可以提高效率吗?或者这是非常优化的?
我认为使用APPLY将是最有效的方法:
SELECT d.Val,
p.Val,
NewVal = d.Val + ISNULL(p.Val, 0)
FROM Dailyt AS d
OUTER APPLY
( SELECT TOP 1 Val
FROM Periodt p
WHERE p.Date <= d.Date
ORDER BY p.Date DESC
) AS p;
Run Code Online (Sandbox Code Playgroud)