Sql server从顶部开始获取差异

时间:2017-07-24 09:11:45

标签: sql-server

实际上我需要的是这样的:我有一行有这么多列,我的脚本应该计算从最高和第二高开始,然后是第二高和第三高的差异......它就是这样。 那么Sql server甚至不能计算出一行中的最大值(据我所知,它可以在一列中计算出最大值) 所以我在我的桌子上使用了pivot,现在我有一列。我订购它们从最大到最低,现在我需要的是,我将如何获得差异:第一个值减去第二个值,第二个值减去第三个值......

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点 - 你应该阅读sql server分析和窗口函数。

鉴于

DROP TABLE T

CREATE TABLE T (ID INT)
INSERT INTO T VALUES
(1),(10),(2),(5)

您可以使用滞后分析功能

SELECT ID ,
    LAG(ID, 1,0) OVER (ORDER BY ID DESC) LAGID,
    ID - LAG(ID, 1,0) OVER (ORDER BY ID DESC) DIFF
FROM T 

结果

ID          LAGID       DIFF
----------- ----------- -----------
10          0           10
5           10          -5
2           5           -3
1           2           -1

(4 row(s) affected)

或使用row_number()窗口函数

SELECT  TID,TRN,UID,URN, TID - UID AS DIFF
FROM
(
SELECT  T.ID TID 
        ,ROW_NUMBER() OVER (ORDER BY T.ID DESC) TRN
FROM T
) S
LEFT JOIN 
(SELECT  ID UID 
        ,ROW_NUMBER() OVER (ORDER BY ID DESC) URN
FROM T
) U
ON URN = TRN - 1

结果

TID         TRN                  UID         URN                  DIFF
----------- -------------------- ----------- -------------------- -----------
10          1                    NULL        NULL                 NULL
5           2                    10          1                    -5
2           3                    5           2                    -3
1           4                    2           3                    -1

(4 row(s) affected)