计算行之间的差异并始终保持第一行为0?

r6hnlfcb  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(365)

我必须计算表x中行值之间的差异(sql server)
表x

ID  A 
1   100
2   200
3   300
4   400

所以我编写了下面的sql查询

SELECT ID,
       A
       A - COALESCE (lag(A) OVER (ORDER BY date), 0) AS Difference
FROM Table X

结果是

ID  A    Difference
1   100   100
2   200  -100
3   300  -100
4   400  -100

我想要的是保持第一行的差值始终为0

ID  A    Difference
1   100   0
2   200  -100
3   300  -100
4   400  -100

但我不知道怎么做。

gk7wooem

gk7wooem1#

你可以试着通过а 的值 default 的参数 LAG() 窗口功能。如文档中所述 default 参数是当偏移量超出分区范围(对于第一行,前一行超出该范围)时返回的值。
表格:

CREATE TABLE Data (ID int, A int, [Date] date)
INSERT INTO Data (ID, A, [Date]) 
VALUES 
  (1, 100, '20200701'), 
  (2, 200, '20200702'), 
  (3, 300, '20200703'), 
  (4, 400, '20200704')

位置:

SELECT 
   ID,
   A,
   LAG(A, 1, A) OVER (ORDER BY [Date]) - A AS Difference
FROM Data

结果:

ID  A   Difference
------------------
1   100 0
2   200 -100
3   300 -100
4   400 -100
dffbzjpn

dffbzjpn2#

感谢@zhorov提供了表模式,数据
您可以使用isnull或coalesce来获得差异。

DECLARE @Data table(ID int, A int, [Date] date)
INSERT INTO @Data (ID, A, [Date]) 
VALUES 
  (1, 100, '20200701'), 
  (2, 200, '20200702'), 
  (3, 300, '20200703'), 
  (4, 400, '20200704')

  SELECT ID,A, ISNULL(LAG(A,1) OVER(ORDER BY DATE),A) AS difference FROM @Data
--or you can use COALESCE
  SELECT ID,A, COALESCE(LAG(A,1) OVER(ORDER BY DATE),A) AS difference FROM @Data
+----+-----+------------+
| ID |  A  | difference |
+----+-----+------------+
|  1 | 100 |        100 |
|  2 | 200 |        100 |
|  3 | 300 |        200 |
|  4 | 400 |        300 |
+----+-----+------------+
ct3nt3jp

ct3nt3jp3#

您可以尝试以下查询。
对于这种类型的查询 order by 子句根据列和应用的 order by 条款 ascending 或者 descending 结果可能不同。

create table Test(ID int,
A int)

insert into Test values
(1,   100),
(2,   200),
(3,   300),
(4,   400)

SELECT ID
,A
,Difference
FROM (
SELECT ID
    ,A
    ,isnull(A - LAG(A) OVER (
            ORDER BY A DESC
            ), 0) Difference
FROM test
) t

现场演示

相关问题