2010-03-05 14 views
5

Tengo una tabla donde he datetimes asociado con un ID:Seleccionar TimeRange común más larga

┌────────────────┬──────────────────────┐ 
│ 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 | 
└────────────────┴──────────────────────┘ 

¿Cuál sería la manera de seleccionar el período de tiempo más largo de estos dos superpuestas location_id 's cuota? En este caso, la salida deseada sería:

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

puedo conseguir fácilmente el período más largo disponible utilizando MIN() y MAX() pero ¿cómo hago para seleccionar el máximo de datetimes mínimos y máximos mínimo de datetimes?

Ah, y esta tabla contiene 19 000 000 filas, por lo que los puntos de bonificación para las sugerencias de que correr rápido :)

+1

¿Hay un error en la salida final deseado: 2009-10-23 23:00:00 2008-10-23 23:00:00 en lugar de ? – Patrick

+1

@Patrick, sí, un error tipográfico. –

Respuesta

2

Usted puede probar algo

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 

Y a continuación, basta con sustituir los identificadores de lo que necesita .

+0

Esto funciona bien y no veo la manera de optimizarlo. Tenía un poco miedo de utilizar una subconsulta, temiendo que matara mi rendimiento, pero la subconsulta se ejecuta por separado tan rápido como esta consulta, así que no hay problema. ¡Gracias! –

0

espero que esto funciona para usted:

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); 
Cuestiones relacionadas