Django Использование Row_Number в ORM с group_by
У меня есть база данных (скриншот прилагается), и я хочу получить среднее значение показаний в соответствии с указанным размером агрегации. Предположим, что мой размер агрегации равен 2. введите описание изображения здесь
Итак, как показано на рисунке, есть четыре показания для определенного идентификатора клиента и идентификатора устройства. Таким образом, мне нужно сгруппировать два показания в одну строку средних показаний, а два других показания - в другую строку.
def get_aggregation_filter(self, queryset, name, value):
subq = queryset.annotate(row_number=Window(
expression=RowNumber()
# partition_by=2,
# order_by=F('time').asc()
))
outsubq = subq.annotate(group_id=((F('row_number') - 1)/ 2) + 1)
queryset = outsubq.annotate(avg=Avg('reading'))
return queryset
Я не могу применить group by к group_id, который я создал с помощью annotate. Любая помощь будет принята с благодарностью.
Почему-то внутренние механизмы django делают не то, что вы думаете, когда комбинируют аннотацию с функциями Window. Фильтрация также не работает при комбинировании аннотации с окном.
Я пробовал запрос и множественный пример, просто чтобы увидеть, что здесь все еще открыт билет :
https://code.djangoproject.com/ticket/28333
Как видите, кто-то использует сырой sql для выполнения того, что вы хотите, и это вызвано тем, что queryset не оборачивает args оконной функции в отдельный подзапрос.