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

これは基本的に、前の行の値を減算するだけです。

4

1 に答える 1

0

次の定義のaVIEWはあなたにとって良くないでしょうか?私が信じているように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())
于 2013-01-05T06:54:18.917 に答える