Aktywne Wpisy

Zopyross +121
Mowa nienawiści to każde forma nawoływania do sprowadzenia tubylcom imigrantów zarobkowych z drugiego końca świata, przez co nawet ludzie po studiach muszą z nimi konkurować przy podjęciu podstawowych prac magazynowych/fizycznych. Niszczysz rynek pracy, rozbijasz tkankę społeczną, ludzie biednieją, rzadziej decydują się na zakładanie rodziny.
Liberalizm=satanizm
#antykapitalizm #blackpill #gospodarka
Liberalizm=satanizm
#antykapitalizm #blackpill #gospodarka
źródło: 6
PobierzInstalacja artystyczna w Leroy Merlin Al. Jerozolimskie - Psy srają w sklepie.
źródło: IMG_LM1543
Pobierz![Nokia komunikator [Adam Śmiałek]](https://wykop.pl/cdn/c3397993/ecdb2887ac9bb3bbe735bef90ad3a51880923c0255c544fe335161dfb04df20e,q80.jpg)




Mam sobie tabelę faktów która jest logiem zamówień z systemu. Każde zamówienia może mieć 1 lub więcej wersji. Wersja się zmienia gdy w zamówieniu zostanie zmieniona kwota (w uproszczeniu). Np. zamówienie było najpierw z kwotą 100, ktoś je zmienił na 30, to w tabeli będę miał dwa wiersze. Version = 1, Amount = 100 i Version = 2, Amount = 30. Moim celem jest policzenie delty czyli o ile spadła/wzrosła kwota. Ostatecznia suma delty dla każdego ID ma dawać amount ostatniej wersji. Przykład na obrazku.
No więc liczę sobie ten Delta Amount poprzez [Amount] - LAG([Amount], 1, 0) OVER (PARTITION BY [ID] ORDER BY [Version])
I wszystko działa i mam dane tak jak chcę.
Ale rozważmy taki scenariusz: ładowanie przyrostowe. Dane ładuje dziennie, biorę max z wartości timestamp i ładuje wiersze tylko większe od max(timestamp) żeby załadować nowe wiersze. Bo stare się nie zmieniają. No, ale tą kalkulację muszę niestety robić po całości.
A chciałbym robić w tym przypadku WHERE dla timestamp > 11, ale tak by nowe wersje np. dla ID = 1, miały dostęp do ostatniej wartości czyli do do Amount = 50 w Version = 3. Jak wiadomo w zwykłym where to nie zadziała bo dane są ucięte przez warunek timestamp = 11. Czyli nowy wiersz nie ma dostępu do wierszy poprzednich gdzie timestamp jest mniejszy niż te 11.
No czyli chciałbym robić to co robię, ale bez jechania partition by po całości. Jak to zrobić? Kursorem (nigdy nie używałem)? Jakieś temp table? Chodzi mi o jak najlepszy performance.
#sql #sqlserver
źródło: comment_1647970842jjDPC0ERvEYfrejDvwUrFS.jpg
PobierzSELECT * FROM source WHERE Timestamp > (SELECT MAX(timestamp) FROM target)
UNION ALL
SELECT * FROM CTE WHERE rn = 1
I na tym zapytaniu (może być jako drugie CTE) robisz sobie swoje obliczenia