如何获得两行之间的差异

时间:2013-04-13 06:36:38

标签: sql sql-server sql-server-2005

我想通过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
....

如何查询上述情况。

4 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

SELECT
    ID,
    MAX(Value1) - MIN(Value1),
    MIN(Value2) - MAX(Value2)
FROM
    myTableName
GROUP BY
    ID

但是有一个假设:第二行总是比第一行Value1更低,Value2更低。{/ p>

答案 1 :(得分:1)

您可以尝试:

SELECT t1.ID, max(t2.VALUE1 - t1.VALUE1)
FROM TABLE1 t1
    left join TABLE1 t2 on t1.id = t2.id
group by t1.id

SQL FIDDLE DEMO:

答案 2 :(得分:0)

此查询将给出ID的最大值与相同ID的最小值之间的绝对差值:

SELECT ID
, ABS(MAX(VALUE1) - MIN(VALUE1)) AS v1Diff
, ABS(MAX(VALUE2) - MIN(VALUE2)) AS v2Diff
FROM TABLE1
GROUP BY ID

Sql Fiidle

但是如果你想得到一个真正的差异(负差异),那么我们需要知道哪一行是第一行,哪一行是下一行。然后我们可以像firstRowValue - nextRowValue一样计算差异。

也许您的表格中有一些RowIDDateTime列,我们可以从这些列中排序来自同一ID的行。 您的表中的哪些列/列是Primery Key

答案 3 :(得分:0)

使用选项与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上的演示