簡體   English   中英

如何在python中做GROUP BY的等效項

[英]How to do an equivalent of GROUP BY in python

我正在每小時時間間隔內查詢SQLite數據庫中的消息,我對其中的一個條目pr userid pr hour感興趣(現在已使用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> start和unixtime <end

您是否在原始查詢中嘗試過“ GROUP BY”而不是“ group by”?

您應該能夠在這些包裝器中利用sql的全部寬度。

如果要在python中處理數據,則需要在python中獲取內存中的數據。

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)

你不開心嗎

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM