Oznaczenie zdublowanych rekordów w "szeregu"

0

Witam,

Także wątek przesunięty z innego tematu bo się bałagan zrobił z mojej winy.

Problem: przez złą implementacje nowej kolumn w tablicy gdzie są zapisywane dane historyczne dla kodów towarowych zostały wstawione zdublowane kody. Tj. wszystkie kolumny są takie same oprócz dat ValidFrom i ValidTo.
Chcę wyczyścić tą sytuację i znaleźć, oznaczyć grupy dubli - pobrać sobie odpowiednie daty startu i końca (min(ValidFrom) i max(ValidTo) dla danej grupy obok siebie. Później usunąć zdublowane kody zostawiając 1 - (np. pierwszy) i zaktualizować tylko kolumnę ValidTo.

Wczoraj wydawało się, że mi się udało na probie 6 różnych kodów ... dziś na kolejnej grupie wyszło, że się myliłem. Mam inne obejście tematu poprzez LEFT JOIN. Ale czuje że można to zrobicsprytniej przy użyciu ROW_NUMBER czy RANK (tak właśnie wczoraj robiłem) ale coś mi nie wychodzi to :|

Meritum: Mamy kod ID i daty ValidFrom i ValidTo - i skończoną ilość dalszych kolumn oznaczających wartości w danym przedziale. Jak oflagować - np policzyć ilość występujących po sobie (w szeregu) takich samych rekordów (dubli) zakładając, że sortujemy Po ItemID i ValidFrom. (Dubel jest gdy wszystkie kolumny są takie same oprócz dat) .

Próbka danych (także w załączniku) :
12345666987 9-4-2021 NULL test1 XXX 11
12345666987 8-4-2021 9-4-2021 test1 XXX 11
12345666987 7-4-2021 8-4-2021 test1 XXX 11
12345666987 6-4-2021 7-4-2021 test1 XXX 11
12345666987 5-4-2021 6-4-2021 test1 XXX 11
12345666987 4-4-2021 5-4-2021 test1 XXX 11
12345666987 3-4-2021 4-4-2021 test1 XXX 11
12345666987 2-4-2021 3-4-2021 test2 ZZZ 90
12345666987 1-4-2021 2-4-2021 test2 ZZZ 90
12345666987 31-3-2021 1-4-2021 test2 ZZZ 90
12345666987 30-3-2021 31-3-2021 test3 WW 17
12345666987 27-3-2021 30-3-2021 test4 WW 17
12345666987 26-3-2021 27-3-2021 test5 WW 17
12345666987 25-3-2021 26-3-2021 test6 CCZ 17
12345666987 23-3-2021 25-3-2021 test6 KK 17
12345666987 20-3-2021 23-3-2021 test6 KK 25
8888899999 9-4-2021 NULL opis XXX 66
8888899999 8-4-2021 9-4-2021 opis XXX 66
8888899999 7-4-2021 8-4-2021 opis KKK 66
8888899999 6-4-2021 7-4-2021 opis XXX 66
8888899999 1-4-2021 6-4-2021 opis LL 66
8888899999 1-1-2021 1-4-2021 opis LL 66

Wizualizacja przykładu:
screenshot-20210413151546.png

Edit: tak by to miało wyglądać po poprawie:
screenshot-20210413153920.png
Example.txt

1

Jako, ze to ma być z tego co piszesz poprawianie danych to nie bawiłbym sie w wyszczególnianie kolumn do porównania tylko policzył checksumę z kolumn które mnie interesuja, zwrócił oczekiwany wynik i zastapił tabelę:

with cteLP as (
select 
	row_number() over (order by itemid,validfrom) lp
	,checksum(itemid,descr,[case],code) cs
	,*
from 
	tab),
rng as
(
select 
	lp
	, row_number() over (partition by cs, grp order by lp) as rod
	, lp + row_number() over (partition by cs, grp order by lp desc) -1 rdo from (
	select
		lp
		,row_number() over ( order by lp)  - row_number() over (partition by cs order by lp) as grp
		,cs
	from
		cteLP
	) dt
)

select 
	ctelp.ItemID
	,ctelp.validfrom
	,d.validto
	,ctelp.descr
	,ctelp.[case]
	,ctelp.code
from 
	rng
	inner join ctelp on ctelp.lp=rng.lp
	inner join ctelp d on d.lp=rng.rdo
where 
	rod=1
order by 1

Wynik

screenshot-20210413181342.png

0

Ufff ja to jednak mam chyba wolne elektrony w mózgu po tym Covidzie bo długo mi zeszło na przejściu kolejnych kroków które zrobiłeś @Panczo. Bardzo ciekawe rozwiązanie - na mój zmęczony mózg dość zakręcone, a z 2 strony pewnie jak się to ogarnie może wydawać się proste (ja muszę to jeszcze przetrawić żeby mi się tak wydawało ;) ).

Także wielkie "muchas gracias" - jak zwykle Genialna odpowiedź!
I tak pewnie posłucham Twojej rady i zbuduje tablicę na nowo.

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