SQL 服务器 - table 中行之间的差异之和

SQL Server - Sum of difference between rows in a table

我有一个 table 格式:

SomeID  SomeData

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

我想求 table 中各行之间的差值之和。即 ( (7-3) + (10-9) + (16-14) + ....)

哪种方法最好

使用自连接和模数:

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;

Demo

此答案假定 SomeID 序列实际上从 1 开始,并在后续的每一行中递增 1。如果没有,那么我们也许可以先在 SomeID 上应用 ROW_NUMBER 并生成一个 1 到 N 的序列。

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;

你可以尝试用ROW_NUMBERwindow函数做一个序列号然后MOD乘以2得到你期望的组然后使用条件聚合函数

查询 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

Results:

|   |
|---|
| 7 |