Группировка записей из базы данных PostgreSQL по неделям или месяцам на основе значения временной метки?

Я уже некоторое время пытаюсь найти решение этой проблемы, но из-за моей неопытности в работе с postgres (и SQL в целом) и Django ORM мне не удалось получить результат, который я мог бы использовать.

У меня эта модель:

class EventItem(models.Model):
    Id = models.CharField(max_length=200, primary_key=True)
    StartTime = models.DateTimeField(null=True)
    EndTime = models.DateTimeField(null=True)
    Duration = models.TimeField(null=True)
    Creator = models.CharField(max_length=50, null=True)

и я хочу получить EventItems и сгруппировать записи по неделям и/или месяцам. То есть для каждой недели, начиная с самой ранней записи, сгруппировать все события за эту неделю в одну группу.

Сейчас я могу вернуть номер недели для каждого отдельного элемента, сделав следующее:

weeks = EventItem.objects.annotate(week=ExtractWeek('StartTime')).values('week')

Но это явно не группирует результаты, и мне также нужно сохранить столбцы из исходной таблицы.

Вы не хотите использовать ExtractWeek, поскольку он просто получает целочисленное значение недели в году, например, 44, что может привести к столкновениям в наборах данных, превышающих год.

Вы захотите использовать TruncWeek, который, по сути, ограничивает значение данных понедельником этой недели. Вы можете объединить его с order_by(), чтобы получить данные, сгруппированные вместе.

from django.db.models.functions import TruncWeek

weeks = EventItem.objects.annotate(week=TruncWeek('StartTime').order_by('week')
Вернуться на верх