/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
finde næsten-dubletter
Fra : Morten Lindow


Dato : 25-03-03 15:29

Hej,

Jeg er ret ny og har følgende spørgsmål:


Jeg har en tabel med fx følgende søjle indeholdende heltal:

hit_start

400000
400001
399999
400025
6454

Jeg vil gerne lave en select der finder alle records, hvor hit_start er
næsten ligmed hit_start i hvilken som helst anden record. "Næsten
ligmed" forstås her som +/- x.

Hvis x er 1 skal selecten altså give

400000
400001
399999

Hvordan gør jeg det?

Jeg kan let gøre det i perl ved først at sortere på hit_start, men det
holder ikke rigtigt i længden.

mvh
Morten Lindow




 
 
Larz (26-03-2003)
Kommentar
Fra : Larz


Dato : 26-03-03 09:33

Morten Lindow <morten@binf.ku.dk> wrote in news:b5pp49$836$1@news.net.uni-
c.dk:
[ 8< 8< 8< ]
> Jeg vil gerne lave en select der finder alle records, hvor hit_start er
> næsten ligmed hit_start i hvilken som helst anden record. "Næsten
> ligmed" forstås her som +/- x.
>
> Hvis x er 1 skal selecten altså give
>
> 400000
> 400001
> 399999
>
> Hvordan gør jeg det?
>
> Jeg kan let gøre det i perl ved først at sortere på hit_start, men det
> holder ikke rigtigt i længden.

Hvis hit_start er 400000 kan du i SQL sige:

SELECT hit_start FROM tabel WHERE hit_start BETWEEN 400000-1 AND 400000+1

--
-
Lars
http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
To mail me remove your pants.

Christian Estrup (26-03-2003)
Kommentar
Fra : Christian Estrup


Dato : 26-03-03 10:02

Jeg læser spørgsmålet således, at hit_start ikke er 'fast' - fx 400000 som i
eksemplet - men er baseret på de enkelte records.

Det burde du kunne opnå som følger:

SELECT T1.hit_start
FROM tabel AS T1 INNER JOIN tabel AS T2
ON T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1 AND T1.hit_start
<> T2.hit_start


- Chr


"Larz" <lp@your-pants-coder.dk> wrote in message
news:Xns934A613577328godlarz@62.243.74.162...
> Morten Lindow <morten@binf.ku.dk> wrote in news:b5pp49$836$1@news.net.uni-
> c.dk:
> [ 8< 8< 8< ]
> > Jeg vil gerne lave en select der finder alle records, hvor hit_start er
> > næsten ligmed hit_start i hvilken som helst anden record. "Næsten
> > ligmed" forstås her som +/- x.
> >
> > Hvis x er 1 skal selecten altså give
> >
> > 400000
> > 400001
> > 399999
> >
> > Hvordan gør jeg det?
> >
> > Jeg kan let gøre det i perl ved først at sortere på hit_start, men det
> > holder ikke rigtigt i længden.
>
> Hvis hit_start er 400000 kan du i SQL sige:
>
> SELECT hit_start FROM tabel WHERE hit_start BETWEEN 400000-1 AND 400000+1
>
> --
> -
> Lars
> http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
> To mail me remove your pants.



Morten Lindow (27-03-2003)
Kommentar
Fra : Morten Lindow


Dato : 27-03-03 09:10



Christian Estrup wrote:
> Jeg læser spørgsmålet således, at hit_start ikke er 'fast' - fx 400000 som i
> eksemplet - men er baseret på de enkelte records.
>
> Det burde du kunne opnå som følger:
>
> SELECT T1.hit_start
> FROM tabel AS T1 INNER JOIN tabel AS T2
> ON T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1 AND T1.hit_start
> <> T2.hit_start
Det virker!! Omend det taer lidt tid, men det er nok ikke så mærkeligt
med alle de sammenligninger der skal laves.

Tak.

mvh
Morten


Nis Jorgensen (01-04-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 01-04-03 12:22

On Thu, 27 Mar 2003 09:09:33 +0100, Morten Lindow <morten@binf.ku.dk>
wrote:

>
>> SELECT T1.hit_start
>> FROM tabel AS T1 INNER JOIN tabel AS T2
>> ON T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1 AND T1.hit_start
>> <> T2.hit_start
>Det virker!! Omend det taer lidt tid, men det er nok ikke så mærkeligt
>med alle de sammenligninger der skal laves.

Du kan evt prøve nogle alternative formuleringer, og se om din
database er hurtigere med dem. Fx:

SELECT T1.hit_start
FROM tabel AS T1
WHERE EXISTS (SELECT t2.hitstart
FROM tabel AS T2
WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
AND T1.hit_start <> T2.hit_start)

eller

SELECT T1.hit_start
FROM tabel AS T1, tabel AS T2
WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
GROUP BY T1.hit_start
HAVING count(*) >1

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Morten Lindow (02-04-2003)
Kommentar
Fra : Morten Lindow


Dato : 02-04-03 13:59

USENET er sgu en lækker ting også når man er nybegynder.
Nu har jeg prøvet lidt af hvert og rapportere her på mine erfaringer med
nedenstående i Access. Min tabel har 2080 rækker. Af disse har 411
næsten-dubletter.


>>>SELECT T1.hit_start
>>>FROM tabel AS T1 INNER JOIN tabel AS T2
>>>ON T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1 AND T1.hit_start
>>><> T2.hit_start
>>
>>Det virker!! Omend det taer lidt tid, men det er nok ikke så mærkeligt
>>med alle de sammenligninger der skal laves.
Den her virker faktisk ikke så godt alligevel. Af en grund som jeg ikke
helt har forstået endnu returnere ovenstående SQL flere identiske
resultater.

>
>
> Du kan evt prøve nogle alternative formuleringer, og se om din
> database er hurtigere med dem. Fx:
>
> SELECT T1.hit_start
> FROM tabel AS T1
> WHERE EXISTS (SELECT t2.hitstart
> FROM tabel AS T2
> WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
> AND T1.hit_start <> T2.hit_start)
Denne her returnerer hver enkel række der har dupletter.

>
> eller
>
> SELECT T1.hit_start
> FROM tabel AS T1, tabel AS T2
> WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
> GROUP BY T1.hit_start
> HAVING count(*) >1
Ja den er rigtig smart med GROUP BY, hvorved jeg kun får en repræsentant
fra hver 'ø' eller dublet-gruppe.

ET SPØRGSMÅL: I stedet for at filtrere med HAVING count(*) > 1 vil jeg
gerne have returneret en søjle med count-værdien. Hvordan gør man det?
Kan man give resultatet af GROUP BY -> count(*) et alias, som man kan
give i select_list'en?

--
Morten Lindow


Nis Jorgensen (03-04-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 03-04-03 12:51

On Wed, 02 Apr 2003 14:59:24 +0200, Morten Lindow <morten@binf.ku.dk>
wrote:

>>>>SELECT T1.hit_start
>>>>FROM tabel AS T1 INNER JOIN tabel AS T2
>>>>ON T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1 AND T1.hit_start
>>>><> T2.hit_start
>>>
>>>Det virker!! Omend det taer lidt tid, men det er nok ikke så mærkeligt
>>>med alle de sammenligninger der skal laves.
>Den her virker faktisk ikke så godt alligevel. Af en grund som jeg ikke
>helt har forstået endnu returnere ovenstående SQL flere identiske
>resultater.

Den returnerer en række for hvert match - så hvis du har 7, 8 og 9 i
din tabel faar du


7 (matchet med 8)
8 (matchet med 7)
8 (mathcet med 9)
9 (matchet med 8)

Det er måske nemmere at se præcis hvad der sker hvis du udtrækker de
to matchende felter:

SELECT T1.hit_start, T2.hit_start ...

>> Du kan evt prøve nogle alternative formuleringer, og se om din
>> database er hurtigere med dem. Fx:
>>
>> SELECT T1.hit_start
>> FROM tabel AS T1
>> WHERE EXISTS (SELECT t2.hitstart
>> FROM tabel AS T2
>> WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
>> AND T1.hit_start <> T2.hit_start)
>Denne her returnerer hver enkel række der har dupletter.

Ja.

>> SELECT T1.hit_start
>> FROM tabel AS T1, tabel AS T2
>> WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
>> GROUP BY T1.hit_start
>> HAVING count(*) >1
>Ja den er rigtig smart med GROUP BY, hvorved jeg kun får en repræsentant
>fra hver 'ø' eller dublet-gruppe.

Den skulle give præcis samme resultat som ovenstående.

>ET SPØRGSMÅL: I stedet for at filtrere med HAVING count(*) > 1 vil jeg
>gerne have returneret en søjle med count-værdien. Hvordan gør man det?

SELECT T1.hit_start, count(*)
FROM tabel AS T1, tabel AS T2
WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
GROUP BY T1.hit_start

>Kan man give resultatet af GROUP BY -> count(*) et alias, som man kan
>give i select_list'en?

Nej - men du kan gøre som ovenfor. Du kan kun angive aliaser i FROM of
SELECT, og kun dem fra FROM kan bruges andre steder.
--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Morten Lindow (02-04-2003)
Kommentar
Fra : Morten Lindow


Dato : 02-04-03 14:04

Nis Jorgensen wrote:

>
> SELECT T1.hit_start
> FROM tabel AS T1, tabel AS T2
> WHERE T1.hit_start BETWEEN T2.hit_start-1 AND T2.hit_start+1
> GROUP BY T1.hit_start
> HAVING count(*) >1

Er det korrekt at hvis jeg stryger HAVING linjen, får jeg en tabel med
unikke rækker tilbage. Altså at sætningen fjerner alle mine dubletter?

--
Morten Lindow


Morten Lindow (26-03-2003)
Kommentar
Fra : Morten Lindow


Dato : 26-03-03 10:56



Larz wrote:
>
>
> Hvis hit_start er 400000 kan du i SQL sige:
>
> SELECT hit_start FROM tabel WHERE hit_start BETWEEN 400000-1 AND 400000+1
Ja men det er let nok, men de 400000 var bare et eksempel. Det jeg vil
er at finde record, for hvilke det gælder at der eksistere andre record
med hit_start næsten ligmed hit_start i en anden record. Man kan vel
kalde det at finde klynger eller øer om man vil.

Tak alligevel,

Morten


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste