SQL Server - 表中行之间的差值之和

SQL Server - Sum of difference between rows in a table

提问人:Vinay 提问时间:1/4/2022 最后编辑:D-ShihVinay 更新时间:3/11/2022 访问量:619

问:

我有一个表格的格式:

SomeID  SomeData

1       3
2       7
3       9
4       10
5       14
6       16
.       .
.       .

我想找到此表中行之间的差值之和。即( (7-3) + (10-9) + (16-14) + ....)

这是最好的方法

sql-server 算法 窗口函数

评论

0赞 D-Shih 1/4/2022
你的 dbms 是多少?sqlserver!=oracle
0赞 RBarryYoung 1/4/2022
为什么是这些行对?为什么不是或或?(3-7)(14-10)(16-9)

答:

3赞 Tim Biegeleisen 1/4/2022 #1

使用自连接和模数:

SELECT SUM(t1.SomeData - t2.SomeData) AS total_diff
FROM yourTable t1
INNER JOIN yourTable t2
    ON t1.SomeID = t2.SomeID + 1
WHERE t1.SomeID % 2 = 0;

演示

这个答案假设序列实际上从 1 开始,并在每下一行递增 1。如果没有,那么我们也许可以首先应用并生成一个 1 到 N 的序列。SomeIDROW_NUMBERSomeID

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY SomeID) rn
    FROM yourTable
)

SELECT SUM(t1.SomeData - t2.SomeData) AS total_diff
FROM cte t1
INNER JOIN cte t2
    ON t1.SomeID = t2.SomeID + 1
WHERE t1.rn % 2 = 0;

评论

0赞 Vinay 1/4/2022
如果someID不按顺序排列,您可以共享查询吗
0赞 Tim Biegeleisen 1/4/2022
你是否仍然做出提供记录排序的假设?SomeID
0赞 Vinay 1/4/2022
通过不按顺序排列,我指的是它可以包含任何值,但@TimBiegeleisen已经通过使用ROW_Number帮助实现了它
3赞 D-Shih 1/4/2022 #2

您可以尝试使用窗口函数制作序列号,然后按 2 进行 MOD 以获得预期的组,然后使用条件聚合函数。ROW_NUMBER

查询 1

SELECT SUM(CASE WHEN rn = 0 THEN SomeData END) - SUM(CASE WHEN rn = 1 THEN SomeData END) 
FROM (
  SELECT SomeData,ROW_NUMBER() over(order by SomeID) % 2 rn
  FROM t t1
) t1

结果

|   |
|---|
| 7 |