我是这个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)只有
有没有任何方法可以达到这个效果。 我不想用光标左右。
答案 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