[SQL] Overlappende datetime records selecteren

Pagina: 1
Acties:

  • Roeland_
  • Registratie: Maart 2000
  • Laatst online: 15-02 10:51
Ik wil via een query op één tabel de overlappende 'datetime' records weergeven, mits deze overlappende records dezelfde groep waarde hebben.

Ik kom er echter niet uit hoe ik deze query moet doen.

Voorbeeld: Ik heb één tabel met 4 kolommen: id(int), van(datetime), tot(datetime) en groep(int).

Inhoud:
1 2006-08-01 22:13:00 2006-08-01 22:30:00 1
2 2006-08-01 22:08:00 2006-08-01 22:20:00 1
3 2006-08-01 22:01:00 2006-08-01 22:03:00 1
4 2006-08-01 22:00:00 2006-08-01 22:00:59 1
5 2006-08-01 22:31:00 2006-08-01 22:33:00 2
6 2006-08-01 22:34:00 2006-08-01 22:40:00 2
7 2006-08-01 22:50:00 2006-08-01 22:55:00 3
8 2006-08-01 22:53:00 2006-08-01 23:00:00 3
9 2006-08-01 22:39:00 2006-08-01 23:39:00 4

- Id 1,2,3 en 4 vallen allen onder groep 1, maar hiervan dienen alleen id 1 en 2 te worden getoond aangezien die elkaar overlappen...
- Id 5 en 6 vallen ook onder dezelfde groep, maar hoeven niet te worden weer gegeven omdat ze elkaar niet overlappen...
- Id 6 en 7 dienen wel te worden weergegeven...
- Id 9 weer niet...

In het 'echt' gaat het om zo'n 100.000 records met per groep een varierend aantal id's.Via php was dit niet zo lastig, echter het script deed er ongeveer 12 uur over om alle resultaten netjes in de csv te hebben geschreven...

Nu heb ik al veel query's, met/zonder JOINS en INNER JOINS bekeken en uitgeprobeerd echter ik heb een idee dat ik geheel op het verkeerde spoor zit en of dit uberhaupt wel mogelijk

Wie kan mij een tipje van de sluier oplichten om te kijken hoe ik dit het beste kan aanpakken?

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 00:48

The Eagle

I wear my sunglasses at night

Om wat voor DB gaat het hier? Ik kan me namelijk voorstellen dat je in Oracle met PL/SQL wel het e.e.a. zou kunnen. 1x een select min, 1x een select max, dat icm een distinct oid....

Moet te doen zijn :Y)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Hoe je 't ook wendt of keert, dit vraagt wel een heleboel van je database...
Wanneer je DB subselects ondersteunt zou ik iets als dit proberen:
SQL:
1
2
3
4
5
6
SELECT * FROM tabel t1
WHERE EXISTS (SELECT id FROM tabel
              WHERE groep = t1.groep
              AND id <> t1.id
              AND van < t1.tot
              AND tot > t1.van)
Maar zorg er dan wel minimaal voor dat er een index op het veld groep bestaat (en op id, maar dat is de primary key neem ik aan). Anders is 't met 100.000 records niet vooruit te branden...

  • Roeland_
  • Registratie: Maart 2000
  • Laatst online: 15-02 10:51
Bedoeling is MySQL...

En helaas is het ook niet een eenmalige query, anders zou ik wel tevreden zijn met die 12 uur :)

  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Ok, dit is weliswaar Oracle maar misschien helpt het je op weg.

Allereerst in je topicstart: je zegt dat id 6 en 7 wel moeten worden weergegeven? Maar die zitten niet in dezelfde groep en overlappen niet. Ik ga er van uit dat je 7 en 8 bedoelt.

Anyway; ik zou beginnen met een index te leggen op groep.
Als je dan een scriptje hebt die alle unieke groepen uitleest, dan kan je die als parameter meegeven aan de query waar het om gaat. Dat zou qua snelheid kunnen schelen.

Dan kom ik vervolgens op zoiets uit:
SQL:
1
2
3
4
5
6
7
8
Select *
  From tabel a
     , tabel b
 Where a.groep = :gegeven_groep
   And b.groep = a.groep
   And a.id != b.id
   And ( a.van Between b.van And b.tot Or
         a.tot Between b.van And b.tot)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

SQL:
1
2
3
4
5
6
select *
from   tabel a
,      tabel b
where  a.groep = b.groep
and    a.van <= b.tot
and    a.tot >= b.van

Who is John Galt?


  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-12-2025

WormLord

Devver

justmental schreef op woensdag 02 augustus 2006 @ 09:15:
SQL:
1
2
3
4
5
6
select *
from   tabel a
,      tabel b
where  a.groep = b.groep
and    a.van <= b.tot
and    a.tot >= b.van
Dit is bijna goed. Als a.van gelijk is aan b.tot, of b.van gelijk is aan a.tot, dan heb je namelijk geen overlap meer volgens mij.
Pagina: 1