2010-02-25 19 views
5

Estoy tratando de hacer lo que parece que debería ser una simple operación de SQL, pero no encuentro la sintaxis correcta para hacerlo rápidamente. Estoy usando SQLite.SQL: obteniendo rápidamente el valor de la columna B donde la columna A es mínima

El problema básico es que tengo una tabla cuya clave principal es (objUid, time). Contiene las columnas objUid, time y frame. A los fines de esta pregunta, el marco es un valor opaco.

Deseo extraer para cada objUid: objUid, minTime, valor de la trama en minTime, maxTime, valor de la trama en maxTime.

... y me gustaría hacerlo lo más rápido posible.

Tengo esto ahora mismo, que funciona, pero si saco las declaraciones "NATURAL JOIN" (lo que significa que no obtengo la columna "frame"), las cosas son aproximadamente el doble de rápidas.

SELECT * FROM (
    SELECT * FROM (
     SELECT objUid, min(time) as minTime, max(time) as maxTime FROM motion GROUP BY objUid 
    ) NATURAL JOIN (
     SELECT objUid, time as minTime, frame as minFrame FROM motion 
    ) 
) NATURAL JOIN (SELECT objUid, time as maxTime, frame as maxFrame FROM motion) 

¿Alguna idea?

Gracias!

Respuesta

2

Uso:

SELECT x.objuid, 
     y.time, 
     y.frame, 
     z.time, 
     z.frame 
    FROM (SELECT m.objuid, 
       MIN(m.time) AS min_time, 
       MAX(m.time) AS max_time 
      FROM MOTION m 
     GROUP BY m.objuid) x 
    JOIN MOTION y ON y.objuid = x.objuid 
       AND y.time = x.min_time 
    JOIN MOTION z ON z.objuid = x.objuid 
       AND z.time = x.max_time 
+0

Su sintaxis es definitivamente superior a la mía (menos de anidación loco), y parece producir los mismos resultados. ... pero no fue más rápido cuando lo probé. ¿Algún otro truco de magia en la manga? – dianders

+0

@dianders: Pude ver algo relacionado con LIMIT, pero dudo que sea escalable para más de un objunto. –

+0

Nunca obtuve ninguna otra respuesta, y la suya fue útil (y me mostró que no había algo realmente obvio que me faltaba). Marque el suyo como "correcto". ¡Gracias! – dianders

Cuestiones relacionadas