2010-03-05 9 views
5

ich einen Tisch, wo ich Datetimes mit einer ID zugeordnet haben:Wählen längste gemeinsame Timerange

┌────────────────┬──────────────────────┐ 
│ location_id | datetime    | 
├────────────────┼──────────────────────┤ 
│ 200333   | 2008-01-01 00:00:00 | 
│ 200333   | 2008-01-01 01:00:00 | 
│ 200333   | 2008-01-01 02:00:00 | 
| ...   | ...     | 
│ 200333   | 2009-10-23 21:00:00 | 
│ 200333   | 2009-10-23 22:00:00 | 
│ 200333   | 2009-10-23 23:00:00 | 
│ 200768   | 2008-06-01 00:00:00 | 
│ 200768   | 2008-06-01 01:00:00 | 
│ 200768   | 2008-06-01 02:00:00 | 
| ...   | ...     | 
│ 200768   | 2009-12-31 00:00:00 | 
│ 200768   | 2009-12-31 00:00:00 | 
│ 200768   | 2009-12-31 00:00:00 | 
└────────────────┴──────────────────────┘ 

Was wäre der Weg sein, den längsten Zeitraum diese zwei sich überlappende location_id -Aktie zu wählen? In diesem Fall würde die gewünschte Ausgabe sein:

┌──────────────────────┬──────────────────────┐ 
│ start    | end     | 
├──────────────────────┼──────────────────────┤ 
│ 2008-06-01 00:00:00 | 2009-10-23 23:00:00 | 
└──────────────────────┴──────────────────────┘ 

ich verfügbar, um die längste Periode bekommen MIN() und MAX() mit leicht kann aber wie würde ich mich über das Maximum Minimum und Datetimes mindestens maximale Auswahl datetimes?

Oh, und diese Tabelle enthält 19 000 000 Zeilen, so Bonuspunkte für Vorschläge, die schnell laufen :)

+1

Gibt es einen Tippfehler in der gewünschten End-Ausgabe: 2009-10-23 23.00.00 statt 2008-10-23 23.00.00 ? – Patrick

+1

@Patrick, yup, ein Tippfehler. –

Antwort

2

Sie versuchen, etwas kann

SELECT MAX(MinDates) MaximumMinDate, 
     MIN(MaxDates) MinimumMaxDate 
FROM (
      SELECT location_ID, 
        MIN([datetime]) MinDates, 
        MAX([datetime]) MaxDates 
      FROM Table 
      WHERE location_ID IN (200333, 200768) 
      GROUP BY location_ID 
     ) sub 

Und dann ersetzen Sie einfach die IDs mit dem, was Sie brauchen .

+0

Das funktioniert gut und ich sehe keinen Weg, wie dies noch optimiert werden könnte. Ich hatte ein bisschen Angst davor, eine Unterabfrage zu verwenden, weil ich befürchtete, dass sie meine Leistung zunichte machen würde, aber die Unterabfrage läuft separat so schnell wie diese ganze Abfrage, also kein Problem. Vielen Dank! –

0

Ich hoffe, das funktioniert für Sie:

SELECT l1.maxtime, l2.mintime FROM 
(SELECT location_id, min(datetime), max(datetime) 
FROM table 
GROUP BY location_id 
) as l1(id, mintime, maxtime) 
, 
(SELECT location_id, min(datetime), max(datetime) 
FROM table 
GROUP BY location_id 
) as l2(id, mintime, maxtime) 
WHERE 
l1.id <> l2.id 
HAVING max(l1.maxtime-l2.mintime); 
Verwandte Themen