suma/różnica sąsiednich rekordów w kolumnie

0

Witam serdecznie
Chciałbym zrobić sumę/różnicę sąsiednich rekordów w zapytaniu, czyli mając tablicę:

lp | stan
1 | 5
2 | 8
3 | 6
4 | 1

Wyświetlić za pomocą selecta:

p | stan | sum
1 | 5 |5
2 | 8 |13
3 | 6 |14
4 | 1 |7

Można w jakiś sposób to zrobić? Oczywiście powyżej podaję mały przykład -chodzi mi o ogólną zasadę działania na sąsiednich rekordach.
Będę wdzięczny za wskazówki

1
select T2.lp, (T1.stan + T2.stan) as SumaDwoch from tablica T1 
inner join tablica T2 on T1.lp = (T2.lp + 1)

Ale to tylko w sytuacji kiedy masz zachowany ciąg Lp (bez "dziur").

1

@Tomasz, a zdajesz sobie sprawę, że jeśli nie użyjesz klauzuli "order", to baza danych zwraca wyniki posortowane w sposób przypadkowy?
Pojęcie 'sąsiedni rekord' jest jak najbardziej nie na miejscu.

0

Poniższe rozwiązanie pozwala na dokonywanie obliczeń (w tym przypadku różnica) pomiędzy "sąsiadującymi" wierszami, gdzie o sąsiedztwie decydują dowolne kryteria sortowania (np. sortowanie po polu [Lp] lub [Prior] lub dowolnego innego).

(kod dla MSSQL)

 
/*
DROP TABLE #T

CREATE TABLE #T
(
	Lp INT
	,Value INT
	,Prior INT 
)

INSERT INTO #T VALUES(1, 5, 2)
INSERT INTO #T VALUES(2, 8, 4)
INSERT INTO #T VALUES(3, 6, 3)
INSERT INTO #T VALUES(4, 1, 9)
*/

WITH T1 AS
(
	SELECT 
		*
		,ROW_NUMBER() OVER(ORDER BY Lp) AS RNO
		--,ROW_NUMBER() OVER(ORDER BY Prior) AS RNO
	FROM #T
)
	SELECT
		T1.Lp
		,T1.Value
		,ISNULL((T2.Value - T1.Value), T1.Value) AS Diff
	FROM T1
		LEFT JOIN T1 AS T2
			ON T1.RNO = T2.RNO + 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1