У меня есть модель Django, хранящаяся в базе данных Postgres, состоящая из значений счетчиков с нерегулярными интервалами:
WidgetCount
- Time
- Count
Я пытаюсь использовать оконную функцию с Lag, чтобы предоставить мне значения предыдущей строки в качестве аннотации. Моя проблема в том, что когда я пытаюсь объединить это с некоторым отдельным усечением даты, оконная функция использует исходные строки, а не четко сгруппированные.
Например, если у меня есть следующие строки:
time count
2020-01-20 05:00 15
2020-01-20 06:00 20
2020-01-20 09:00 30
2020-01-21 06:00 35
2020-01-21 07:00 40
2020-01-22 04:00 50
2020-01-22 06:00 54
2020-01-22 09:00 58
И я хочу вернуть набор запросов, показывающий первое чтение за день, я могу использовать:
from django.db.models.functions import Trunc
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"))
Что дает мне:
date count
01/01/20 15
01/01/21 35
01/01/22 50
Я хотел бы добавить аннотацию, которая дает мне вчерашнее значение (чтобы я мог показать изменение за день).
date count yesterday_count
01/01/20 15
01/01/21 35 15
01/01/22 50 35
If I do:
from django.db.models.functions import Trunc, Lag
from django.db.models import Window
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))
Возвращение второй строки дает мне 30 для вчера_count, то есть показывает мне предыдущую строку перед применением отдельного предложения.
Если я добавлю следующее предложение partiion:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count"), partition_by=F("date")))
Тогда вчера_count равно None для всех строк.
Я могу выполнить этот расчет на Python, если мне нужно, но это меня немного злит, и я хотел бы узнать, возможно ли то, что я пытаюсь сделать.
Спасибо!