Rivien turvallinen deduplikointi
Poista täysin ja lähes samanlaiset rivit säilyttäen yksi ensisijainen tietue
Rivien turvallinen deduplikointi on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Duplikaattien poisto-ongelma
"Taulukossa on päällekkäisiä rivejä. Poistakaa ne, mutta säilyttäkää kustakin yksi kopio." Lähes jokaisessa data engineering -haastattelussa tulee vastaan jokin tämän ongelman muoto. Haasteena on tehdä tämä turvallisesti: säilyttää täsmälleen yksi kanoninen rivi ja välttää sellaisten erillisten tietueiden poistaminen, jotka vain näyttävät samanlaisilta.
Käsittelemme duplikaattien tunnistamista, säilytettävän kopion valitsemista, duplikaattien poistamista SELECT-kyselyssä sekä duplikaattien fyysistä poistamista taulukosta.
Määrittele duplikaatti ensin
Ensimmäinen haastattelijalle esitettävä kysymys on: "Mikä tekee kahdesta rivistä duplikaatteja?" Vaihtoehtoja ovat esimerkiksi:
- Täsmälleen samanlaiset duplikaatit: jokainen sarake on identtinen.
- Avaimen perusteella päällekkäiset rivit: sama liiketoiminta-avain, kuten sama
email, mutta muut sarakkeet voivat olla erilaisia.
Tekniikka on erilainen kummassakin tapauksessa. Älkää olettako, vaan varmistakaa duplikaatin määritelmä. Tämä on tärkein yksittäinen vaihe, ja haastattelijat odottavat teidän kysyvän siitä.
Duplikaattien tunnistaminen
Kun haluatte löytää päällekkäiset avaimet, ryhmitelkää duplikaatin määrittävien sarakkeiden perusteella ja säilyttäkää ryhmät, joiden lukumäärä on suurempi kuin yksi. Näin näette, mihin avaimiin ongelma vaikuttaa ja kuinka monta kopiota kustakin on olemassa, ennen kuin muutatte mitään.
Tunnistuskyselyn suorittaminen ensin on mainitsemisen arvoinen hyvä käytäntö: varmistatte ongelman laajuuden ennen poistamista.
SELECT email, COUNT(*) AS copies
FROM users
GROUP BY email
HAVING COUNT(*) > 1
ORDER BY copies DESC;Täsmälleen samanlaiset duplikaatit: DISTINCT
Jos duplikaatit ovat todella identtisiä jokaisen sarakkeen osalta, vain lukuun tarkoitettu duplikaatit poistava näkymä on yhtä yksinkertainen kuin SELECT DISTINCT *. Myös UNION (ilman ALL-määrettä) poistaa päällekkäiset rivit.
DISTINCT auttaa kuitenkin vain silloin, kun haluatte poistaa duplikaatit koko rivistä ettekä tarvitse valita, mikä kopio säilytetään. Jos duplikaatit määritellään avaimen perusteella ja sarakkeet eroavat toisistaan, tarvitsette ranking-funktiota.
-- Read-only dedup of exact-duplicate rows
SELECT DISTINCT customer_id, name, signup_date
FROM customers;Avaimen perusteella päällekkäiset rivit: ROW_NUMBER
Kun riveillä on sama avain mutta muut sarakkeet eroavat, osioikaa rivit avaimen perusteella ja numeroikaa kukin kopio. rn = 1 merkitsee säilytettävää riviä ja rn > 1 poistettavia ylimääräisiä rivejä.
Ikkunan sisäinen ORDER BY ratkaisee, mikä kopio on kanoninen. Valitkaa järjestys harkiten; voitte esimerkiksi säilyttää viimeksi päivitetyn rivin.
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY updated_at DESC
) AS rn
FROM users;Kanonisen kopion valitseminen
Paketoikaa numerointi CTE:hen ja säilyttäkää vain rn = 1. Näin palautuu yksi rivi avainta kohti, nimenomaan se rivi, jonka ORDER BY sijoitti ensimmäiseksi.
Tämä SELECT-muoto ei muuta tietoja: se sopii erinomaisesti siistin näkymän muodostamiseen tai tietojen siirtämiseen INSERT ... SELECT -lauseella duplikaatit poistavaan kohdetaulukkoon ilman lähdetaulukon muuttamista.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY email ORDER BY updated_at DESC
) AS rn
FROM users
)
SELECT user_id, email, name, updated_at
FROM ranked
WHERE rn = 1;Järjestyksen valinnalla on merkitystä
Osion sisäinen ORDER BY on liiketoimintapäätös, ei muodollisuus:
ORDER BY updated_at DESCsäilyttää tuoreimman tietueen.ORDER BY created_at ASCsäilyttää alkuperäisen tietueen.ORDER BY id ASCsäilyttää pienimmän sijaisavaimen, mikä on hyödyllinen vakaa mielivaltainen valinta.
Lisätkää yksilöllinen tasatilanteen ratkaiseva avain, jotta valittu rivi määräytyy yksiselitteisesti myös silloin, kun ensisijaisessa järjestyssarakkeessa on sama arvo.
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY updated_at DESC, id ASC
) AS rnDuplikaattien fyysinen poistaminen
Jos haluatte todella poistaa duplikaatit taulukosta, tunnistakaa ylimääräiset rivit (rn > 1) ja poistakaa ne. PostgreSQL:ssä ja SQL Serverissä voitte poistaa rivejä CTE:n avulla; MySQL:ssä käytetään usein itseensä liittyvää liitosta tai alikyselyä.
Suorittakaa aina ensin vastaava SELECT, jotta voitte esikatsella täsmälleen, mitkä rivit poistetaan. Sokkoina tehty poisto on syy siihen, miksi hakijat epäonnistuvat tässä kysymyksessä.
WITH ranked AS (
SELECT ctid,
ROW_NUMBER() OVER (
PARTITION BY email ORDER BY updated_at DESC, id ASC
) AS rn
FROM users
)
DELETE FROM users
WHERE ctid IN (SELECT ctid FROM ranked WHERE rn > 1);Itseensä liittyvän poiston malli
Perinteinen siirrettävä lähestymistapa säilyttää pienimmän id-arvon sisältävän rivin kutakin päällekkäistä avainta kohti ja poistaa loput itseensä liittyvän liitoksen avulla. Se ei tarvitse ikkunafunktioita, mikä on tärkeää vanhemmissa tietokantamoottoreissa.
Liitosehto yhdistää jokaisen rivin toiseen saman avaimen riviin, jolla on pienempi id-arvo. Jokainen rivi, jolla on tällainen pienemmän id-arvon pari, on poistettava duplikaatti.
DELETE u1
FROM users u1
JOIN users u2
ON u1.email = u2.email
AND u1.id > u2.id;Turvallisuustarkistuslista
Suojatkaa itsenne ennen poistamista:
- Suorittakaa poisto transaktion sisällä, jotta voitte tehdä
ROLLBACK-palautuksen, jos lukumäärä näyttää väärältä. - Suorittakaa ensin poistettavien rivien
SELECT COUNT(*)ja tarkistakaa tuloksen järkevyys. - Harkitkaa varmuuskopiotaulukkoa:
CREATE TABLE users_bak AS SELECT * FROM users. - Varmistakaa, että
PARTITION BY-sarakkeet todella määrittävät duplikaatin. Muuten saatatte poistaa erillisiä tietueita.
BEGIN;
-- run the DELETE, inspect row count
-- COMMIT; if correct, otherwise ROLLBACK;Lähes päällekkäiset rivit ja normalisointi
Joskus rivit eivät ole täsmälleen samanlaisia, mutta ovat loogisesti samoja: 'Ann@X.com' ja 'ann@x.com' tai rivien lopussa olevat välilyönnit. Osioikaa rivit normalisoidun lausekkeen, ei raakasarakkeen, perusteella.
Normalisoinnin mainitseminen osoittaa kokemusta: tosielämän duplikaatit piiloutuvat usein kirjainkoon, välilyöntien tai muotoilun eroihin, joita suoraviivainen avainten vertailu ei havaitse.
ROW_NUMBER() OVER (
PARTITION BY LOWER(TRIM(email))
ORDER BY updated_at DESC, id ASC
) AS rnPikatarkistus
Valitkaa turvallinen lähestymistapa duplikaattien poistamiseen.
Kertaus: Duplikaattien turvallinen poistaminen
Poistakaa duplikaatit järjestelmällisesti:
- Määritelkää ensin, mikä on duplikaatti, ja tunnistakaa ne sitten käyttämällä GROUP BY / HAVING COUNT(*) > 1.
- Täsmälleen samanlaiset duplikaatit →
DISTINCT. Avaimen perusteella päällekkäiset rivit → avaimen perusteella osioituROW_NUMBER, josta säilytetäänrn = 1. - Ikkunan
ORDER BYvalitsee kanonisen kopion. Lisätkää yksilöllinen tasatilanteen ratkaiseva avain. - Poistakaa
rn > 1-rivit transaktion sisällä sen jälkeen, kun olette tarkistanut lukumäärän esikatselulla. - Normalisoikaa avaimet, jotta löydätte myös lähes päällekkäiset rivit.
Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 90
- Oppitunnit
- 360
Usein kysytyt kysymykset
Onko oppitunti ”Rivien turvallinen deduplikointi” ilmainen?
Kyllä – oppitunnin ”Rivien turvallinen deduplikointi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Rivien turvallinen deduplikointi”?
Poista täysin ja lähes samanlaiset rivit säilyttäen yksi ensisijainen tietue Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Rivien turvallinen deduplikointi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?
Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Ryhmän Top-N-rivit ROW_NUMBER-funktiolla
- Tasatilanteiden käsittely Top-N-tuloksissa
- Rivien turvallinen deduplikointi
- Avaimen viimeisimmän rivin säilyttäminen