Dubbele items

goedemiddag,

heeft iemand hier toevallig een sql script om dubbele vermeldingen te verwijderen ??

bij voorbaat dank

Hoi Guest,

Kreeg een tip dat je dubbele entries door sorteren er uit kon krijgen. Mogelijk kan je bij het sorteer commando opties meegeven dat hij het uniek moet maken.

De vriendelijke groet Jan Marco

Guest:

Sorteren is natuurlijk mogelijk, zeker als je wilt verwijderen door bijv. gebruik te maken van een cursor. Dit is iets wat MSSQL heeft, weet niet of mySQL ook zoiets heeft. Vraag is eerst op welke database je dit wilt uitvoeren en natuurlijk wat je onder een dubbele verstaat. Is een record dubbel als je alleen naar het telefoonnummer kijkt of wil je ook verder kijken naar de combinatie telefoonnummer en naam. Mocht je het op MSSQL willen doen, dan kan ik wel een scriptje “verzinnen”.

Hoi Guest,

Een ander techniek is m.i. het maken van hulptabellen. De records er in copieren door “insert into …select distinct” SQL commando uit te voeren. Zie appendix voor een voorbeeld.

De vriendelijke groet Jan Marco

Appendix A: Het verkrijgen van unieke plaatsnamen uit white_subscriber:

DROP TABLE IF EXISTS city_street;

create table city_street (
city varchar(80) not null,
streetname varchar(64) not null,
primary key (city,streetname),
index (city)
) type=myisam;

DROP TABLE IF EXISTS cities;
create table cities (
city varchar(32) not null,
primary key (city)
) type=myisam;

insert into city_street select distinct city, streetname from white_subscriber;
insert into cities select distinct city from city_street;

Ik wil niet weten hoe lang het duurt om zo’n query voor alle kolommen in subscriber uit te voeren.

Wat Jan Marco zegt klopt:

[code]wc -l cmw0501.csv
6003505 cmw0501.csv

timethis sort -u -o cmw0501_sorted.csv cmw0501.csv
TimeThis : Command Line : sort -u -o cmw0501_sorted.csv cmw0501.csv
TimeThis : Start Time : Fri Jun 24 08:55:04 2005
TimeThis : End Time : Fri Jun 24 09:17:39 2005
TimeThis : Elapsed Time : 00:22:34.578

wc -l cmw0501_sorted.csv
6003505 cmw0501_sorted.csv[/code]
maar het heeft geen zin

Herstel, vergeten recordnummer uit te sluiten:

wc -l cmw0501_sorted.csv 5941493 cmw0501_sorted.csv

Ook 22 minuten ?

Ook in bijv. white_subscriber zitten dubbelen. Via onderstaande script kun je deze verwijderen op MSSQL. Het print statement is erin gezet zodat je nog wat kan zien waarmee ie bezig is. Nadeel: het scriptje loopt wel even.

declare @phone varchar(20), @postalcode1 varchar(9),
@housenumber1 varchar(24), @lastname1 varchar(128),
@id1 int

declare @postalcode2 varchar(9),
@housenumber2 varchar(24), @lastname2 varchar(128),
@id2 int

set nocount on

/* Gebruik een cursor om door de dubbele nummers te bepalen /
declare csrTel cursor Forward_only Static for
select phone
from white_subscriber
where phone is not null
group by phone
having count(
) > 1
order by phone

Open csrTel
fetch next from csrTel into @Phone
while @@Fetch_Status = 0
begin
/* Gebruik een cursor om de dubbele entries voor een nummer op te halen */
declare csrDbl cursor Forward_Only Static for
select postalcode, housenumber, lastname, id
from white_subscriber
where phone = @phone
order by postalcode, housenumber, lastname

open csrDbl
/* Gebruik eerste record als referentie */
fetch next from csrDbl into @postalcode1, @housenumber1, @lastname1, @id1

fetch next from csrDbl into @postalcode2, @housenumber2, @lastname2, @id2
while @@Fetch_Status = 0
begin
/* Vergelijk records*/
if @postalcode1 = @postalcode2 and @housenumber1 = @housenumber2 and
@lastname1 = @lastname2 begin
print ‘B:’ + @postalcode1 + ‘/’ + @housenumber1 + ‘/’ + @lastname1 + ‘/’ + convert(char(7), @id1)
print ‘D:’ + @postalcode2 + ‘/’ + @housenumber2 + ‘/’ + @lastname2 + ‘/’ + convert(char(7), @id2)

    /* Verwijder het dubbele record */
    delete from white_phonenumber where id = @id2
    delete from white_info where id = @id2
    delete from white_subscriber where id = @id2
 end
 else begin
      /* Afwijking in 1 van de test velden */
      select @postalcode1 = @postalcode2, @housenumber1 = @housenumber2, 
             @lastname1 = @lastname2, @id1 = @id2
 end

 /* Lees volgend record */
 fetch next from csrDbl into @postalcode2, @housenumber2, @lastname2, @id2

end

/* Sluit cursor */
close csrDbl
deallocate csrDbl

/* Lees volgend nummer */
fetch next from csrTel into @Phone
end

/* Close cursors */
close csrTel
deallocate csrTel

set nocount off

Hoi RGJ, Weerman, ET,

DROP TABLE IF EXISTS white_subscriber_temp;

create table white_subscriber_temp (
#id integer unsigned not null,
title varchar(40) default null,
firstname varchar(128) default null,
infix varchar(40) default null,
lastname varchar(128) default null,
streetname varchar(64) default null,
housenumber varchar(24) default null,
postalcode varchar(9) default null,
city varchar(80) default null,
phone varchar(20) default null,
category char(5) default null

primary key (id)

) type=myisam;

insert into white_subscriber_temp select distinct title, firstname, infix, lastname, streetname, housenumber, postalcode, city, phone, category from white_subscriber;

Geeft

select lastname, city from white_subscriber_temp;

“blokje” st “rare n” ner | Nijverdal
"blokje" st “rare n” ntepe | Vlaardingen
"griekse teken" LV “griekse teken”/Labor Vincit | Leiden

5940492 rows in set, dus 5941493 - 5940492 = 1001 records meer er uit gehaald. Weerman gebruik jij ook cd-foongids 2005/2006?

Zal nog een keer draaien om tijdsduur te bepalen.

De tijdsduur is 2 uur om tabel uniek te maken op een “snelle” machine!

Kan iemand mij de rare letters verklaren? Schakelt hij over naar andere karakter set o.i.d?

De vriendelijke groet Jan Marco

Doch, dit is ZM:

[code]timethis sort -u -o zmw0502_sorted.csv -t ; -k 2,14 zmw0502.csv

TimeThis : Command Line : sort -u -o zmw0502_sorted.csv -t ; -k 2,14 zmw0502.csv
TimeThis : Start Time : Fri Jun 24 14:41:51 2005
TimeThis : End Time : Fri Jun 24 15:06:12 2005
TimeThis : Elapsed Time : 00:24:21.015

wc -l zmw0502.csv
5934352 zmw0502.csv

wc -l zmw0502_sorted.csv
5873699 zmw0502_sorted.csv
[/code]
twee minuten langer maar alles zet uit als het warm is 8)

Jan Marco, kan je gids versie en rij-id noemen, dat is fors minder zoeken.

Hoi RGJ,

Ik geloof dat ik dat ik cd-foongids 2005/2006. Ik zal straks even opnieuw dumpen om goed te zetten. Ik wacht nog op de tijdsduurmeting.

Rij id raak ik kwijt in white_subscriber_temp. Het zijn de de laatste records van de White_subscriber_temp

Ik denk dat het komt dat je gehele table space dumpt er karacters in staan die iets met karacter set doen o.i.d.

De vriendelijke groet Jan Marco

De karakters zijn UTF-8 Unicode karakters. Ik zie ze normaal onder Linux en ik zie rommel in een command prompt.

Normaal kan je een command prompt met /u starten om Unicode output te krijgen, maar dat werkt blijkbaar niet goed met MySQL.exe.

Ben benieuwd wat jij op deze query krijgt. In MySQL 4 zou je nog

set names utf-8

kunnen proberen, voorafgaand aan de query.

Hoi RGJ,

Zit ook in white_subscriber:

select lastname, city, phone from white_subscriber

“blokje” st “rare n” ner | Nijverdal | 0548620175
“blokje” st “rare n” ntepe | Vlaardingen | 0104705075
“griekse teken” LV “griekse teken”/Labor Vincit | Leiden | 0715134332

6003506 rows in set.

Spatie moet er tussen uit anders foutmelding:

Als je dit er voor zet geeft query niet het resultaat als jij op Linux krijgt.

De vriendelijke groet Jan Marco

P.S. Ik kan mij nog herinneren dat Iceman met karactersets in Foonrip bezig is geweest.

Is een probleem van MySQL onder Windows, verder niet.

Het motto van Foondump is: dumpen wat er staat, geen bewerkingen op de data doen.

De UTF-8 data wordt door bijna alle programma’s goed verwerkt, inclusief PHP Foonsearch (fs2005.php). Ik denk overigens dat Megafoon er wel problemen mee zal hebben.

Hoi RGJ,

Lijkt mij een erg goede principe om vast te houden.

Lijk mij ook. Ik zal wel in Iceman’s code gaan zoeken…

De vriendelijke groet Jan Marco

In die tijd werd er echt nog geen utf-8 gebruikt, dus daar zal je weinig mee opschieten.