如何在python中做一个等效的GROUP BY

时间:2015-04-01 23:22:03

标签: python sqlite

我在每小时间隔内查询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;端

2 个答案:

答案 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)

你不受理吗?