SQL - группа по специальному случаю

Я новичок в этом 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

Там, где он выполнил операцию как (ab), затем (ac) и так далее для каждой WO. Таким образом, из приведенного выше примера первая строка WO 12 с разметкой и выполняла вычитание столбцов x, y и z со второй строкой. И так третий ряд. То же самое произошло с WO 14, но поскольку существует только две строки, поэтому (ab) только

Есть ли способ, который может достичь этого результата. Я не хочу использовать курсор или так.

2 ответа

Поскольку вы работаете на 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


Это должно сделать трюк (присоединение к таблице к себе), но не уверен в производительности:

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.

licensed under cc by-sa 3.0 with attribution.