Avatar billede Slettet bruger
17. september 2003 - 15:30 Der er 6 kommentarer og
1 løsning

Liste af dato'er hvor dubletter optræder

jeg vil gerne have en liste af dato'er hvor en given liste af station_id's ALLE figurerer med entry

table tests
id, station_id, date


dvs

1, 2, 20-11-2001
2, 3, 20-11-2001
3, 2, 20-11-2001
4, 3, 20-12-2001
5, 4, 20-12-2001
6, 2, 20-12-2001
7, 3, 20-12-2001
8, 4, 20-12-2001
8, 4, 20-12-2001

select dato .... where (station_id IN (4,2,3)

returnerer 20-12-2001
og IKKE 20-11-2001, da station_id 4 ikke har en entry d. 20-11-2001


lige nu laver jeg en frygtelig grim én, hvor jeg hiver listen af dato'er for den færste station i listen og derefter tjekker om alle stationer har en entry for hver enkelt dato :(
Avatar billede terry Ekspert
17. september 2003 - 17:57 #1
You can try something like this

SELECT DISTINCT D1.dato
FROM tests AS D1
WHERE EXISTS(SElect 1 from tests D2 WHERE D1.dato = D2.dato and D2.station_id = 2) AND EXISTS (SElect 1 from tests D2 WHERE D1.dato = D2.dato and D2.station_id = 3) AND EXISTS (SElect 1 from testsD2 WHERE D1.dato = D2.dato and D2.station_id = 4)
Avatar billede terry Ekspert
17. september 2003 - 18:26 #2
if you have problems with that then

SELECT DISTINCT D1.dato
FROM tests AS D1
WHERE EXISTS(SElect * from tests D2 WHERE D1.dato = D2.dato and D2.station_id = 2) AND EXISTS (SElect * from tests D2 WHERE D1.dato = D2.dato and D2.station_id = 3) AND EXISTS (SElect * from testsD2 WHERE D1.dato = D2.dato and D2.station_id = 4)
Avatar billede arne_v Ekspert
17. september 2003 - 18:47 #3
Hvad med en 4 dobbelt join ?

SELECT dato
FROM tests d1, tests d2, tests, d3, tests d4
WHERE d1.dato=d2.dato AND d2.dato=d3.dato AND d3.dato=d4.dato AND
      d1.station_id=1 AND d2.station_id=2 AND d3.station_id=3 AND d4.station_id=4;

muligvis (skal testes !) vil den være hurtigere end EXISTS.
Avatar billede janus_007 Nybegynder
17. september 2003 - 19:54 #4
Ingen grund til at gøre det så besværligt, det klares nemt og hurtigt med et derived table:

select a.date from
(
select [date], station_id
from tests
where station_id in (4,2,3)
group by [date], station_id
) as a
where station_id in (4,2,3)
group by a.date
having count(*) = 3

Hvor "tests" er din tabel med data, husk at korrigere having count = antallet af station_id's
Avatar billede terry Ekspert
17. september 2003 - 20:45 #5
whats "besværligt" with WHERE EXISTS :o)
Avatar billede janus_007 Nybegynder
17. september 2003 - 23:08 #6
Ikke noget specielt! Ikke andet end du laver 3 exists som subselects og bagefter distincter resultatet. Det er ikke så performance venligt :O)
Avatar billede Slettet bruger
17. september 2003 - 23:20 #7
dog er det ikke så fedt at den benytter count, da station kan optræde flere gange på samme dag, men nu har jeg fået fornyet inspiration, tak!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester