Sql server 2008 引用另一行的计算列函数?

Sql server 2008 引用另一行的计算列函数?,sql-server-2008,tsql,sql-server-2005,Sql Server 2008,Tsql,Sql Server 2005,我对SQL有点陌生,在将这段代码转换成一个可以用于计算列的函数时遇到了麻烦。作为select语句,这非常有效 select (coalesce(a.samplevalue - ( select b.samplevalue from numericsamples b where b.rowid = a.rowid - 1), a.samplevalue)) as Diff from dbo.NumericSamples a 这基本上只是减去上一行的值。使用以下定义的

我对SQL有点陌生,在将这段代码转换成一个可以用于计算列的函数时遇到了麻烦。作为select语句,这非常有效

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

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

使用以下定义的
视图对您来说不是更好吗?
使用
ISNULL()
而不是
COALESCE()
,因为我相信它会稍微快一点。 不过,我不确定我的加入标准是否正确

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())

什么是RDBMS和版本?假设SQL Server不能(至少不能作为
持久化的
计算列,您可以将其包装在标量UDF中,并在非持久化的计算列中使用,但性能可能会很差)我正在使用SQL Server,我希望它是一个持久化的计算列,因为大约有500万条记录。用不同的方法减去前一行,有没有解决这个问题的方法。我真的很想在新数据被推入数据库时计算这些数据,而到目前为止,我无法控制传入的数据。@MartinSmith是的,说得好,希望OP能有所启发us@PatPav-什么版本的SQL Server?2012年有
LAG
LEAD
,这可能有助于根本不需要它,这取决于您计划如何使用它。在所有测试之后,我很可能会使用sql server 2005或2008。