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

时间:2016-08-03 12:04:21

标签: sql-server-2012

数据示例:

part val
1   3.0
2   4.0
3   5.0
5   6.0

如果当前值列“part”大于之前的1,我需要从列“val”获取前一行。

所需结果的示例:

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

1 个答案:

答案 0 :(得分:0)

试试这个:

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