Python SQL函数,按分钟查询分组日期

时间:2012-02-29 13:07:14

标签: python sql sqlite

我有一个SQL数据库,其中的行包含给定日期时间的EUR / USD价格:

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 01:26:33',0.8913,0.8913,0.8913,0.8913)

('2002-01-02 01:27:12',0.8946,0.8946,0.8947,0.89462)

('2002-01-02 01:27:49',0.8946,0.8946,0.8947,0.89462)

('2002-01-02 01:28:00',0.8947,0.8946,0.8947,0.8946454545454546)

('2002-01-02 01:28:00',0.8946,0.8946,0.8947,0.8946454545454546)

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

('2002-01-02 01: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 01:29:49',0.8947,0.8946,0.8947,0.89465)

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

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

('2002-01-02 01:30:41',0.8945,0.8945,0.8946,0.8945299999999999)

......所以对21行结果一个。

在01:27和01:34参数之间我想要的功能是,只获得8行:

2002-01-02 01:27:xx,买价@ 01:27,最大买入价在01:27和01:28之间,最低买入价在01:27和01:28之间,买价@ 1: 28

2002-01-02 01:28:xx,买价@ 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 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

我建议您使用MySQLdb 然后使用fetchmany(8)获取前8列

以下是MySQLdb的用户指南:http://mysql-python.sourceforge.net/MySQLdb.html

这是下载链接:http://sourceforge.net/projects/mysql-python

这就是我从你所了解的先生

谢谢..

答案 2 :(得分: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循环来处理从当前查询中获得的信息可能是最容易的。