Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2014 15:16:38

despair4
Зарегистрирован: 2014-09-07
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

агрегация по времени суток

есть таблица с одним из полей типа DateTime в субд pgsql

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

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

( чтобы запрос вернул 24 числа )

Офлайн

#2 Окт. 28, 2014 16:41:58

lead-in
Зарегистрирован: 2014-10-13
Сообщения: 19
Репутация: +  5  -
Профиль   Отправить e-mail  

агрегация по времени суток

Не самый красивый вариант, но…

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

Офлайн

#3 Окт. 29, 2014 09:36:35

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

агрегация по времени суток


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

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

тут сразу и посчитать количество, зачем через itertools извращаться?

Офлайн

#4 Окт. 29, 2014 14:53:24

despair4
Зарегистрирован: 2014-09-07
Сообщения: 55
Репутация: +  0  -
Профиль   Отправить e-mail  

агрегация по времени суток

к сожалению не понял как 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

Офлайн

#5 Окт. 29, 2014 21:56:25

lead-in
Зарегистрирован: 2014-10-13
Сообщения: 19
Репутация: +  5  -
Профиль   Отправить e-mail  

агрегация по времени суток

тут сразу и посчитать количество, зачем через 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 или что там у вас).

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version