Найти - Пользователи
Полная версия: агрегация по времени суток
Начало » Django » агрегация по времени суток
1
despair4
есть таблица с одним из полей типа DateTime в субд pgsql

как выполнить агрегацию по часам?

( чтобы показало сколько записей в таблице в течении каждого часа)

( чтобы запрос вернул 24 числа )
lead-in
Не самый красивый вариант, но…

1) Из каждой даты вытащить конкретный час:

qs = QuerySet.objects.filter().extra(select={'hour': 'extract (hour from "appname_tablename".datefieldname)'}).order_by('hour')

2) Cгруппировать полученный queryset:

from itertools import groupby
items = groupby(qs, lambda x: x.hour)

Т.о., items должен содержать примерно такой список:

[(0, [<записи относящиеся к 0-му часу>]), (1, [<записи относящиеся к 1-му часу>]), и т.д]

Нету под рукой Django с PostgresSQL, проверить не могу, но по-идее должно работать.
Если не подходит этот вариант, смотрите в сторону создания custom агрегации, но там придётся “заморочиться”.

Ссылки:
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
https://docs.python.org/2/library/itertools.html#itertools.groupby
inoks

lead-in
1) Из каждой даты вытащить конкретный час:

qs = QuerySet.objects.filter().extra(select={'hour': ‘extract (hour from “appname_tablename”.datefieldname)’}).order_by('hour')

тут сразу и посчитать количество, зачем через itertools извращаться?
despair4
к сожалению не понял как extra пользоваться, написал:

    cursor = connection.cursor()
    cursor.execute("""select extract( hour from "killTime" ) as a1,count(*) as cnt from analizer_kill
    where "characterID"=%s  group by a1 having count(*)>%s order by cnt desc;""",[pilot_id,sign_kill])
    r=cursor.fetchall()
    
        
    time_slice=[]
    for i in r:
        d={}
        d["hour"]=int(i[0])
        d["kills"]=i[1]
        time_slice.append(d)

сюда sql инъекцию не всунут? pilot_id поступает как часть url
lead-in
тут сразу и посчитать количество, зачем через itertools извращаться?

Согласен, так лучше, сразу не сообразил:
from django.db.models import Count
qs = QuerySet.objects.filter().extra(select={'hour': '''extract( hour from "killTime" )'''}).values('hour').annotate(Count('id'))

сюда sql инъекцию не всунут? pilot_id поступает как часть url
Подстраховаться лишним наверно не будет, хотя бы проверить на int (uuid или что там у вас).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB