2010-02-25 5 views
5

J'essaie de faire ce qui semble être une simple opération SQL, mais je ne trouve pas la bonne syntaxe pour le faire rapidement. J'utilise SQLite.SQL: Obtenir rapidement la valeur de la colonne B où la colonne A est minimale

Le problème de base est que j'ai une table dont la clé primaire est (objUid, time). Il contient les colonnes objUid, time et frame. Pour les besoins de cette question, frame est une valeur opaque.

Je souhaite extraire pour chaque objet: objUid, minTime, valeur de frame à minTime, maxTime, valeur de frame à maxTime.

... et j'aimerais le faire le plus rapidement possible.

J'ai cela maintenant, qui fonctionne, mais si je supprime les instructions "NATURAL JOIN" (ce qui signifie que je n'ai pas la colonne "frame"), les choses sont deux fois plus rapides.

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) 

Des idées?

Merci!

Répondre

2

Utilisation:

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

Votre syntaxe est nettement supérieure à la mienne (moins de nidification fou), et il semble produire les mêmes résultats. ... mais ce n'était pas plus rapide quand je l'ai testé. D'autres tours de magie dans votre manche? – dianders

+0

@dianders: Je pouvais voir quelque chose impliquant LIMIT, mais je doute qu'il soit adaptable à plus d'un objet. –

+0

Je n'ai jamais eu d'autres réponses, et la tienne m'a été utile (et m'a montré qu'il n'y avait pas quelque chose de vraiment évident qui me manquait). Marquer le vôtre comme "correct". Merci! – dianders

Questions connexes