如果order子句中的当前值与以前的特定值不同,则获取前一个行值?

问题描述:

数据的例子:如果order子句中的当前值与以前的特定值不同,则获取前一个行值?

part val 
1 3.0 
2 4.0 
3 5.0 
5 6.0 

我需要从塔“VAL”得到上一列,如果电流值列“份”比以前更大的由1

的所期望的结果的例子:

part val val_lag1 
1 3.0 NULL 
2 4.0 3.0 
3 5.0 4.0 
5 6.0 NULL 

通过使用LAG功能我得到这个结果:

part val val_lag1 
1 3.0 NULL 
2 4.0 3.0 
3 5.0 4.0 
5 6.0 5.0 

我知道它可以通过连接表本身完成。但我想知道:是否有可能通过LAG获得相同的结果?

这是我用来获取例子脚本:

SELECT 1 part, 3.0 val 
INTO #t 

INSERT INTO #t VALUES 
(2, 4.0), 
(3, 5.0), 
(5, 6.0) 

SELECT 
    *, 
    LAG(t.val, 1) OVER(ORDER BY t.part) val_lag1 
FROM #t t 

SELECT 
    t.*, 
    tt.val val_lag1 
FROM #t t 
LEFT JOIN #t tt ON t.part = tt.part + 1 

DROP TABLE #t 

试试这个:

SELECT 1 part, 3.0 val 
INTO #t 

INSERT INTO #t VALUES 
(2, 4.0), 
(3, 5.0), 
(5, 6.0) 

SELECT 
    *, 
    CASE WHEN t.part-LAG(t.part, 1) OVER(ORDER BY t.part)=1 
     THEN LAG(t.val, 1) OVER(ORDER BY t.part) 
     ELSE NULL 
    END AS val_lag1 
FROM #t t 

DROP TABLE #t 
+0

谢谢你很多。 – Holden263