2013-01-04 26 views
0

我对SQL有点新,并且无法将此代码转换为可用于计算列的函数。这可以作为选择语句完美工作。引用另一行的计算列函数?

select (coalesce(a.samplevalue - (
    select b.samplevalue 
    from numericsamples b 
    where b.rowid = a.rowid - 1), a.samplevalue)) as Diff 
from dbo.NumericSamples a 

这基本上只是减去前一行的值。

+0

什么RDBMS和版本更快?假设SQL Server不能(至少不能作为持久计算列)无论如何,你可以将它包装在标量UDF中,并将其用于非持久计算列,但性能可能很差) –

+0

我正在使用Sql服务器,我希望它是一个持续计算的列,因为大约有五百万条记录。任何想法都可以攻击这个以不同方式减去前一行的问题。我真的很喜欢这样做,因为新数据被推入数据库,而现在我无法控制输入数据。 –

+0

@MartinSmith是的,好点,让我们希望OP启发我们 – Pondlife

回答

0

以下定义的VIEW会不会更好? 使用ISNULL()而不是COALESCE(),因为我相信它会稍微快一点。 虽然我不确定我的JOIN标准是否正确。

CREATE VIEW [dbo].[Answer] 
WITH SCHEMABINDING -- !Please read up about SCHEMABINDING! 
AS 
SELECT T1.rowid 
     ,Result = ISNULL(T1.samplevalue - T2.samplevalue, T1.samplevalue) 
FROM dbo.NumericSamples T1 
JOIN dbo.NumericSamples T2 ON T1.rowid - 1 = T2.rowid 
-- OR 
-- JOIN dbo.NumericSamples T2 ON T1.rowid = T2.rowid -1 

关于ISNULL() VS COALESCE() - 看来,ISNULL()是在这种情况下

IF OBJECT_ID('tempdb.dbo.#ISNULL') IS NOT NULL DROP TABLE #ISNULL 
IF OBJECT_ID('tempdb.dbo.#COALESCE') IS NOT NULL DROP TABLE #COALESCE 

DECLARE @StopW DATETIME = GETDATE() 
SELECT T1.rowid 
     ,Result = ISNULL(T1.samplevalue - T2.samplevalue, T1.samplevalue) 
INTO #ISNULL 
FROM dbo.NumericSamples T1 
JOIN dbo.NumericSamples T2 ON T1.rowid - 1 = T2.rowid 

PRINT DATEDIFF(MS, @StopW, GETDATE()) 
SET @StopW = GETDATE() 

SELECT T1.rowid 
    ,Result = COALESCE(T1.samplevalue - T2.samplevalue, T1.samplevalue) 
INTO #COALESCE 
FROM dbo.NumericSamples T1 
JOIN dbo.NumericSamples T2 ON T1.rowid - 1 = T2.rowid 

PRINT DATEDIFF(MS, @StopW, GETDATE()) 
相关问题