Django, Postgresql Функция агрегирования по месяцам также использует год - PullRequest
0 голосов
/ 03 мая 2019

У меня есть таблица базы данных, которая содержит «билеты» за 2 года.У каждого билета есть дата работы.Я хочу подсчитать общее количество билетов в каждом месяце по году (например, январь 2018 года отличается от января 2019 года).

Когда я собирал воедино запрос, я наткнулся на то, что сработало, но я делаюне знаю почему.Или, если запрос имеет смысл.Вот оно:

qs = Ticket.filter(work_date__range=[datetime.date(2018, 1, 1), 
datetime.date.today()]).\
annotate(year=ExtractYear('work_date'), 
month=ExtractMonth('work_date')).\
values('year','month').\
annotate(count=Count('month')).order_by('year', 'month')

Предоставление этого вывода:

{'count': 13816, 'year': 2018, 'month': 1},
{'count': 12778, 'year': 2018, 'month': 2}, 
{'count': 13960, 'year': 2018, 'month': 3},
{'count': 14128, 'year': 2018, 'month': 4}, 
{'count': 15277, 'year': 2018, 'month': 5}, 
{'count': 15689, 'year': 2018, 'month': 6}, 
{'count': 14905, 'year': 2018, 'month': 7}, 
{'count': 16025, 'year': 2018, 'month': 8}, 
{'count': 14044, 'year': 2018, 'month': 9}, 
{'count': 16332, 'year': 2018, 'month': 10}, 
{'count': 15397, 'year': 2018, 'month': 11}, 
{'count': 14348, 'year': 2018, 'month': 12}, 
{'count': 17166, 'year': 2019, 'month': 1}, 
{'count': 15504, 'year': 2019, 'month': 2}, 
{'count': 16311, 'year': 2019, 'month': 3}, 
{'count': 14910, 'year': 2019, 'month': 4}, 
{'count': 440, 'year': 2019, 'month': 5}

Я ожидаю, что, поскольку функция агрегирования рассчитывает только по «месяцу», что, например, все месяцы 1 будутв том же количестве, независимо от года.

Я выполнил простой запрос по месяцам и использовал метод .count (), и я получил те же результаты, что и выше.Значит, счета верны.

Почему это работает?Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 03 мая 2019

Вы получаете группы по комбинации год / месяц, так как это ваши значения.Если вы хотите получить счет за месяц, измените значение values('year','month') на values('month').

Счет - это просто поле, которое вы рассчитываете.Вместо этого вы можете сосчитать «id», и вы получите те же цифры.Вы всегда можете посмотреть сгенерированный запрос, это может прояснить ситуацию для вас.

print(qs.query)
...