PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Anotação da janela do Django usando combinada com cláusula distinta


Eu acho que o principal problema é que você está misturando as operações que usadas na anotação geram um conjunto de consultas agrupadas, como soma, com uma operação que simples cria um novo campo para cada registro no conjunto de consultas fornecido, como yesterday_count=Window(expression=Lag("count")) .

Então encomendar realmente importa aqui. Então, quando você tenta:
WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))

O conjunto de consultas do resultado é simplesmente o WidgetCount.objects.distinct("date") anotado, nenhum agrupamento é realizado.

Sugiro desacoplar suas operações para que fique mais fácil entender o que está acontecendo e observe que você está iterando sobre o objeto python, portanto, não precisa fazer novas consultas!

Observe o uso da operação SUM como exemplo porque estou recebendo um erro inesperado com o operador FirstValue. Então estou postando com a Sum para demonstrar a ideia que continua a mesma. A ideia deve ser a mesma para o primeiro valor apenas alterando acc_count=Sum("count") para first_count=FirstValue("count")
for truncDate_groups in Row.objects.annotate(trunc_date=Trunc('time','day')).values("trunc_date")\
                      .annotate(acc_count=Sum("count")).values("acc_count","trunc_date")\
                      .order_by('trunc_date')\
                      .annotate(y_count=Window(Lag("acc_count")))\
                      .values("trunc_date","acc_count","y_count"):
    print(truncDate_groups)

RESULTADO:
{'trunc_date': datetime.datetime(2020, 1, 20, 0, 0, tzinfo=<UTC>), 'acc_count': 65, 'y_count': None}
{'trunc_date': datetime.datetime(2020, 1, 21, 0, 0, tzinfo=<UTC>), 'acc_count': 75, 'y_count': 162}
{'trunc_date': datetime.datetime(2020, 1, 22, 0, 0, tzinfo=<UTC>), 'acc_count': 162, 'y_count': 65}

Acontece que o operador FirstValue requer o uso de uma função do Windows para que você não possa aninhar FirtValue e depois calcular o Lag, portanto, neste cenário, não tenho certeza se você pode fazer isso. A questão é como acessar a coluna First_Value sem aninhar janelas.