usuwanie nadmiarowych rekordów (powtórzeń, ale z zachowaniem jednego rekordu)

0

Witam. Ma napisane takie zapytanie, które numeruje mi wiersze w ramach wydzielonych partycji. Partycją jest w tym wypadku kolumna 'g.swcp_id' i w jej ramach ponumerowane są kolejne rekordy.
Zapytanie wygląda następująco:

select g.swcp_id, row_number() over (partition by g.swcp_id order by g.swcp_id) as rekord
from pl_ecp_harmonogramy g;

lub tak:

with cte as
                (select g.swcp_id, row_number() over (partition by g.swcp_id order by g.swcp_id) as rekord
                from pl_ecp_harmonogramy g)
select * from cte;

Tak czy siak, wynik wygląda tak:

screenshot-20201019225058.png

I teraz chciałem usunąć te nadmiarowe rekordy (np. 51 jest dwa razy, 1001 trzy razy) takim zapytaniem:


with cte as
                (select g.swcp_id, row_number() over (partition by g.swcp_id order by g.swcp_id) as rekord
                from pl_ecp_harmonogramy g)

delete from cte
where row_number > 1;

ale dostaję taki błąd:
screenshot-20201019225409.png

Znalazłem taką składnię tego deleta gdzieś na forum, ale to dotyczył T-SQL. Ma ktoś jakiś pomysł jak to można zrobić w Firebirdzie??

4

Masz jakiś unikalny ID na tej tabeli pl_ecp_harmonogramy ? Musisz mieć coś, co ci jednoznacznie zidentyfikuje taki rekord.
Wtedy możesz zrobić tak:

delete pl_ecp_harmonogramy  where id in (select id from (select id, g.swcp_id, row_number() over (partition by g.swcp_id order by g.swcp_id) as rekord
from pl_ecp_harmonogramy g) as t  where record > 1 )
0
UglyMan napisał(a):

Masz jakiś unikalny ID na tej tabeli pl_ecp_harmonogramy ? Musisz mieć coś, co ci jednoznacznie zidentyfikuje taki rekord.

Tak mam. takim kluczem jest 'id'. Pokombinuje jeszcze z tym co mi napisałeś.

1
UglyMan napisał(a):

Masz jakiś unikalny ID na tej tabeli pl_ecp_harmonogramy ? Musisz mieć coś, co ci jednoznacznie zidentyfikuje taki rekord.

Wtedy możesz zrobić tak:

delete pl_ecp_harmonogramy  where id in (select id from (select id, g.swcp_id, row_number() over (partition by g.swcp_id order by g.swcp_id) as rekord
from pl_ecp_harmonogramy g) as t  where record > 1 )

Twoje rozwiązanie jest bardzo dobre. Właśnie o to mi chodziło.

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