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

2024-09-27 00:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

the database

我想把这些数据分成1分钟一组,并获取一些信息,我编写了一个python程序,调用sqlite3数据库。现在,我有一个计划:

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)

当我这样做的时候:

^{pr2}$

我得到的结果是:

('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.89464545454546)

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

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

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

('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.89452999999999)

。。。一个代表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


Tags: from数据库sqldatetimebuyminselectcurrency
3条回答

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

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

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

先生,这就是我对你的理解

谢谢。。在

试试这个:

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 消除重复行。在
  • 每组的第一个和最后一个价格出现在不同的行上。到 在同一行上联接它们需要联接。这就是 上面有两个内部接头。在

如果您希望SQL为您完成这项工作,您需要执行GROUP BY分钟;然后可以使用MIN(minp)和MAX(minp)来获取每分钟的最低价格范围。但是,看起来整个日期是一个SQL列,所以并不容易。在

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

如果您不能修改SQL表模式(或者不想修改),那么编写一个python循环来处理从当前查询中获得的信息可能是最简单的。在

相关问题 更多 >

    热门问题