我在每小时间隔内查询SQLite数据库中的消息,我对一个条目pr userid pr hours感兴趣(现在使用GROUP BY子句成功完成了)。要查询每小时间隔的数据库需要相当长的时间,所以我想如果我只查询数据库一次没有任何时间间隔,那么我会节省时间,然后操纵结果数组(以小时大小的块分块)。从而完成与原始方法相同的操作。但是我怎么能这样做呢?
for k in range(0,3000):
start = 1398942000+k*60*60
end = 1398942000+(k+1)*60*60
cur.execute('SELECT userid, unixtime, latitude, longitude FROM table WHERE unixtime > {start} AND unixtime < {end} GROUP BY userid'.format(start = start, end = end))
这是我现在的查询。这很好用,但需要花费很多时间。理想情况下它看起来像这样:
cur.execute('SELECT userid, unixtime latitude, longitude FROM message')
然后
* list = fetchall bla bla bla*
for k in range(0,137*24):
start = 1398942000+k*60*60
end = 1398942000+(k+1)*60*60
thisHourInterval = list[:indextoClosestUnixTimeToEnd]
list = list[indextoClosestUnixTimeToEnd:]
*Only one entry pr id in thisHourInterval*
当我认为这将是一个更快的解决方案时,我错了吗?数据量相当大,可能> 4gig。
要清楚 - 我知道如何从数据库中获取数据,但我正在寻找与Group BY等效的 python ,其中unixtime&gt; start和unixtime&lt;端
答案 0 :(得分:0)
您是否尝试过'GROUP BY'而不是原始查询中的'group by'?
您应该能够在这些包装器中使用完整的sql。
如果你想在python中操作数据,你需要在python中获取内存中的数据。
答案 1 :(得分:0)
cur.execute('SELECT userid, unixtime, latitude, longitude FROM table WHERE 1=1')
d = {}
for line in cur.iterdump():
index=(line[1]-1398942000)%3600 # line[1] might want to be line['unixtime']
if((index in d) == False):
d[index] = []
d[index].append(line)
你不受理吗?