提问人:Vinay 提问时间:1/4/2022 最后编辑:D-ShihVinay 更新时间:3/11/2022 访问量:619
SQL Server - 表中行之间的差值之和
SQL Server - Sum of difference between rows in a table
问:
我有一个表格的格式:
SomeID SomeData
1 3
2 7
3 9
4 10
5 14
6 16
. .
. .
我想找到此表中行之间的差值之和。即( (7-3) + (10-9) + (16-14) + ....)
这是最好的方法
答:
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 的序列。SomeID
ROW_NUMBER
SomeID
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 |
评论
sqlserver!=oracle
(3-7)
(14-10)
(16-9)