SQL - 按特殊情况分组

时间:2014-05-10 09:32:17

标签: sql sql-server sql-server-2008

我是这个sql的新手。我有一个表格如下,按日期排序,例如

WO  X   Y  Z   Date
12  10 10  12  10-05-2014 7:10
12  8  10  12  10-05-2014 8:10
12  8  12  12  10-05-2014 9:12
14  16 10  14  10-05-2014 10:10
14  10 10  12  10-05-2014 10:15

现在我想执行一个操作,以便预期的结果是

WO  X   Y  Z   Date
12 -2   0  0  10-05-2014 8:10
12 -2   2  0  10-05-2014 9:12
14 -6   0 -2  10-05-2014 10:15

对于每个WO,它已经执行了(a-b),然后是(a-c)等操作。 因此,从上面的例子中,它采用了第一行的WO 12,并且用第二行执行第x,y和z列的减法。等第三排。 与WO 14相同,但因为只有两行,所以(a-b)只有

有没有任何方法可以达到这个效果。 我不想用光标左右。

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题(将表连接到自身),但不确定性能如何:

SELECT t1.WO , t2. date as myDate ,t2.X - t1.X as Xdiff, t2.Y - t1.Y as Ydiff, t2.Z - t1.Z as Zdiff
FROM (t as t1
JOIN t as t2
ON t1.WO = t2.WO
     AND t1.Date < t2.Date
     AND t1.Date IN (SELECT min(Date) FROM t WHERE t.WO = t1.WO));

请注意,它不仅适用于SQL Server。

答案 1 :(得分:1)

正如您在SQL Server 2008上一样,您可以使用ROW_NUMBER函数:

SELECT 
   t1.WO,
   t1.x - t2.x,
   t1.y - t2.y,
   t1.z - t2.z,
   t1.date
FROM tab AS t1
JOIN 
 (
   SELECT tab.*,
      ROW_NUMBER()
      OVER (PARTITION BY WO 
      ORDER BY date) AS rn
   FROM tab
 ) AS t2
  ON t1.WO = t2.WO 
 AND t1.date <> t2.date
 AND t2.rn = 1