我想通过 id 找到同一列组上两行之间的差异
ID Value1 Value2
a 500 200
b 300 200
a 100 300
b 300 400
....
预期产出
ID Value1 Value2
a 400 -100
b 0 -200
....
如何查询上述条件。
我想通过 id 找到同一列组上两行之间的差异
ID Value1 Value2
a 500 200
b 300 200
a 100 300
b 300 400
....
预期产出
ID Value1 Value2
a 400 -100
b 0 -200
....
如何查询上述条件。
您可以使用以下内容:
SELECT
ID,
MAX(Value1) - MIN(Value1),
MIN(Value2) - MAX(Value2)
FROM
myTableName
GROUP BY
ID
但是有一个假设:第二行总是大于Value1
和Value2
小于第一行。
你可以试试:
SELECT t1.ID, max(t2.VALUE1 - t1.VALUE1)
FROM TABLE1 t1
left join TABLE1 t2 on t1.id = t2.id
group by t1.id
此查询将给出 ID 的最大值和同一 ID 的最小值之间的绝对差:
SELECT ID
, ABS(MAX(VALUE1) - MIN(VALUE1)) AS v1Diff
, ABS(MAX(VALUE2) - MIN(VALUE2)) AS v2Diff
FROM TABLE1
GROUP BY ID
但是如果你想得到一个真正的差异(负差异),那么我们需要知道哪一行是第一行,哪一行是下一个。然后我们可以计算差异firstRowValue - nextRowValue
。
也许您的表有一些RowID
或DateTime
列,我们可以从中订购相同的行ID
。您的表格中有哪些列/列Primery Key
?
将选项与 CTE 和 ROW_NUMBER() 排名函数一起使用
;WITH cte AS
(
SELECT ID,
CASE ROW_NUMBER() OVER(PARTITION BY ID ORDER BY 1/0) % 2
WHEN 1 THEN Value1
WHEN 0 THEN -1 * Value1 END AS Value1,
CASE ROW_NUMBER() OVER(PARTITION BY ID ORDER BY 1/0) % 2
WHEN 1 THEN Value2
WHEN 0 THEN -1 * Value2 END AS Value2
FROM dbo.test22
)
SELECT ID, SUM(Value1) AS Value1, SUM(Value2) AS Value2
FROM cte
GROUP BY ID
SQLFiddle上的演示