我有一个SQL数据库,其中的行包含给定日期时间的EUR / USD价格:
我想将这些数据分成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
答案 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
代表“日期 - 分钟”。我们按日期 - 分组进行分组。datetime
。 SELECT DISTINCT
消除了重复的行。答案 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循环来处理从当前查询中获得的信息可能是最容易的。