2012-02-29 40 views
0

我有一個包含歐元/美元的價格對於一個給定的日期時間行的SQL數據庫:Python的SQL函數,查詢組日期以分鐘

the database

我想這些數據分成1組分鐘並獲得一些信息,我寫了一個調用sqlite3數據庫的python程序。現在,我有這個程序:

def SQLQuerySpecial(currency,start,end): 
    sql = 'SELECT f.datetime, f.buy, c.minp, c.maxp, c.avgp FROM {c} f INNER JOIN (SELECT MIN(datetime) mindate, MAX(datetime) maxdate, MIN(sell) minp, MAX(sell) maxp, AVG(buy) avgp FROM {c} GROUP BY strftime("%Y-%m-%d %H:%M",datetime)) c ON f.datetime = c.mindate or f.datetime = c.maxdate'.format(c = currency) 

當我這樣做:

SQLQuerySpecial("EUR", "2002-01-02 01:27:00", "2002-01-02 01:34:00") 

我得到的結果是:

( '2002-01-02 1時26分33秒',0.8913 ,0.8913,0.8913,0.8913)

( '2002-01-02 1點27分12秒',0.8946,0.8946,0.8947,0.89462)

( '2002-01-02 1點27分49秒' ,0.8 946,0.8946,0.8947,0.89462)

( '2002-01-02 1點28分○○秒',0.8947,0.8946,0.8947,0.8946454545454546)

('2002-01-02 1點28分○○秒'0.8946,0.8946,0.8947,0.8946454545454546)

( '2002-01-02 1點28分43秒',0.8946,0.8946,0.8947,0.8946454545454546)

(' 2002-01-02 1時28 :43',0.8946,0.8946,0.8947,0.8946454545454546)

('2002-01-02 01:29:49',0.8946,0.8946,0.8947,0.89465)

( '2002-01-02 1點29分49秒',0.8947,0.8946,0.8947,0.89465)

( '2002-01-02 1時29分52秒',0.8946,0.8946,0.8947,0.89465 )

( '2002-01-02 1點29分52秒',0.8947,0.8946,0.8947,0.89465)

( '2002-01-02一點30分41秒',0.8945,0.8945,0.8946 ,0.8945299999999999)

...等等21行結果。

我想與我的1點27個和1時34分參數之間的功能是什麼,是爲了獲得只有8行:

2002-01-02 01:27:XX,購買價格@ 1點27分,買入價在01:27和01:28之間,買入價在01:27和01:28之間,買入價在1:28之間

2002-01-02 01:28:xx,buy price @ 01 :28,01:28和01:29之間的最高買入價,01:28和01:29之間的最低買入價,@ 1:29的買入價,

2002-01-02 01:29:xx ...

...

至2002-01-02 01:34:XX ...

老實說,我試圖找到做正確的方式,但它的棘手對我來說,我不是非常好的SQL。感謝您的閱讀和幫助。

特別感謝unutbu

回答

3

試試這個:

sql = ''' 
    SELECT DISTINCT 
     f.dm, 
     f1.price AS first, 
     f.maxp AS max, 
     f.minp AS min, 
     f2.price AS last 
    FROM (
     SELECT datetime, strftime("%Y-%m-%d %H:%M",datetime) dm, 
       MIN(datetime) mindate, MAX(datetime) maxdate, 
       MIN(price) minp, MAX(price) maxp 
     FROM {c} 
     WHERE datetime >= ? AND datetime < ? 
     GROUP BY dm 
     ) f 
    INNER JOIN {c} f1 
    ON f1.datetime = f.mindate 
    INNER JOIN {c} f2 
    ON f2.datetime = f.maxdate 
    '''.format(c = currency) 
  • dm代表 「日期分鐘」。我們按日期分鐘分組。
  • 有一些行具有相同的datetimeSELECT DISTINCT 消除重複的行。
  • 每個組的第一個和最後一個價格出現在不同的行上。到 加入他們在同一行需要一個JOIN。這是上面兩個INNER JOINS的 的用途。
+0

這個工程,我使用運營商BETWEEN的日期,謝謝 – prince 2012-02-29 15:23:43

0

如果您希望SQL爲您完成此操作,您需要執行GROUP BY分鐘;那麼您可以使用MIN(minp)和MAX(minp)來獲取每分鐘最低價格的範圍。但是,它看起來像整個日期是一個SQL列,所以並不那麼容易。

SELECT datetime_without_seconds, MIN(minp), MAX(minp) FROM ... 
    GROUP BY datetime_without_seconds 

如果你不能修改你的SQL表的模式(或不願意),它可能是最容易編寫Python循環,處理您從當前查詢獲得的信息。