sql >> Databasteknik >  >> RDS >> PostgreSQL

Django Window annotation med kombinerad med distinkt klausul

Jag tror att huvudproblemet är att du blandar operationer som används i annotering genererar en grupperad frågeuppsättning såsom summa med en operation som enkelt skapar ett nytt fält för varje post i den givna frågeuppsättningen såsom yesterday_count=Window(expression=Lag("count")) .

Så här är det verkligen viktigt att beställa. Så när du försöker:

WidgetCount.objects.distinct("date").annotate(date=Trunc("time", "day"), yesterday_count=Window(expression=Lag("count")))

Resultatfrågeuppsättningen är helt enkelt WidgetCount.objects.distinct("datum") annoterad, ingen gruppering utförs.

Jag skulle föreslå att du kopplar bort dina operationer så att det blir lättare att förstå vad som händer, och märker att du itererar över python-objektet så du behöver inte göra några nya frågor!

Observera att jag använder SUM-operation som exempel eftersom jag får ett oväntat fel med FirstValue-operatorn. Så jag gör ett inlägg med Sum för att visa idén som förblir densamma. Idén bör vara densamma för det första värdet bara genom att ändra acc_count=Sum("count") till 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)

UTGÅNG:

{'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}

Det visar sig att FirstValue-operatören kräver att du använder en Windows-funktion så att du inte kan kapsla FirtValue och sedan beräkna Lag, så i det här scenariot är jag inte riktigt säker på om du kan göra det. Frågan blir hur man kommer åt kolumnen First_Value utan att kapsla fönster.



  1. MYSQL Datetime, ta bort sekunder

  2. MS-Access basklass och härledda objekt

  3. Fel:Ingen modul med namnet psycopg2.extensions

  4. Hur man beräknar procent i PostgreSQL