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;
此答案假定 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_NUMBER
window函数做一个序列号然后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
| |
|---|
| 7 |
我有一个 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;
此答案假定 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_NUMBER
window函数做一个序列号然后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
| |
|---|
| 7 |