2010-02-25 11 views
5

Basit bir SQL işlemi olması gerektiği gibi görünmeye çalışıyorum ama bunu yapmak için doğru sözdizimini bulamıyorum. SQLite kullanıyorum. Temel sorun, birincil anahtarı (object, time) olan bir tablonun olmasıdır. ObjUid, time ve frame sütunlarını içerir. Bu sorunun amaçları için çerçeve opak bir değerdir.SQL: A sütununun minimum olduğu her yerde B sütununun değerini hızla elde etmek

Her nesne için çıkartmak istiyorum: objUid, minTime, minTime'da frame değeri, maxTime, maxTime'da frame değeri.

... ve mümkün olduğunca çabuk yapmak isterim.

Şu an bunu yapıyorum, ancak bu, "NATURAL JOIN" ifadelerini ("çerçeve" sütununu alamadığım anlamına gelir) çıkarırsam işler iki kat daha hızlıdır.

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) 

Herhangi bir fikir?

Teşekkürler!

cevap

2

Kullanım:

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

Kişisel sözdizimi madeninde (daha az çılgın yuvalama) kesinlikle üstün olduğunu ve aynı sonuçları elde etmek gibi görünüyor. ... ama test ettiğimde daha hızlı değildi. Diğer sihirli numaralar kolunuzu yukarı mı taşıyor? – dianders

+0

@dianders: LIMIT'i içeren bir şey görebiliyordum, ancak şüphesiz birden fazla objuid için ölçeklenebilir. –

+0

Hiçbir zaman başka bir cevabınız olmadı ve sizinkileri yardımcı oldu (ve bana gerçekten eksik olduğum belli bir şeyin olmadığını gösterdi). Seninkini "doğru" olarak işaretlemek. Teşekkürler! – dianders