2010-02-25 17 views
5

Sto provando a fare quello che sembra dovrebbe essere una semplice operazione SQL, ma non sto trovando la sintassi giusta per farlo rapidamente. Sto usando SQLite.SQL: Ottenere rapidamente il valore della colonna B dovunque la colonna A è minima

Il problema di base è che ho una tabella la cui chiave primaria è (objUid, ora). Contiene le colonne objUid, time e frame. Ai fini di questa domanda, il frame è un valore opaco.

Vorrei estrarre per ogni oggetto: objUid, minTime, valore di frame in minTime, maxTime, valore di frame in maxTime.

... e mi piacerebbe farlo il più rapidamente possibile.

Ho questo al momento, che funziona, ma se estraggo le istruzioni "NATURAL JOIN" (il che significa che non ottengo la colonna "frame"), le cose sono circa il doppio.

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) 

Qualche idea?

Grazie!

risposta

2

Usa:

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

tua sintassi è sicuramente superiore alla mia (meno di nidificazione pazza), e sembra produrre gli stessi risultati. ... ma non è stato più veloce quando l'ho provato. Qualche altro asso nella manica? – dianders

+0

@dianders: Potrei vedere qualcosa che coinvolge LIMIT, ma dubito che sarebbe scalabile a più di un objuid. –

+0

Non ho mai ricevuto altre risposte, e il tuo è stato utile (e mi ha mostrato che non c'era qualcosa di veramente ovvio che mi mancasse). Contrassegnare il tuo come "corretto". Grazie! – dianders

Problemi correlati