sql >> Database >  >> RDS >> PostgreSQL

Django Window-annotatie in combinatie met afzonderlijke clausule

Ik denk dat het grootste probleem is dat je bewerkingen combineert die in annotatie worden gebruikt en een gegroepeerde queryset zoals som genereert met een bewerking die eenvoudig een nieuw veld maakt voor elke record in de gegeven queryset, zoals yesterday_count=Window(expression=Lag("count")) .

Bestellen is hier dus echt van belang. Dus als je het probeert:

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

De resultaatqueryset is eenvoudig de WidgetCount.objects.distinct("date") geannoteerd, er wordt geen groepering uitgevoerd.

Ik zou willen voorstellen om je operaties te ontkoppelen, zodat het gemakkelijker wordt om te begrijpen wat er gebeurt, en merk op dat je het python-object herhaalt, dus je hoeft geen nieuwe query's te maken!

Opmerking bij het gebruik van SUM-bewerking als voorbeeld omdat ik een onverwachte fout krijg met de FirstValue-operator. Dus ik post met Sum om het idee te demonstreren dat hetzelfde blijft. Het idee zou hetzelfde moeten zijn voor de eerste waarde, gewoon door acc_count=Sum("count") te wijzigen to 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)

UITGANG:

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

Het blijkt dat de FirstValue-operator een Windows-functie nodig heeft, zodat je FirtValue niet kunt nesten en vervolgens Lag kunt berekenen, dus in dit scenario weet ik niet precies of je het kunt doen. De vraag wordt hoe toegang te krijgen tot de First_Value-kolom zonder vensters te nesten.



  1. Oracle ListaGG, Top 3 meest voorkomende waarden, weergegeven in één kolom, gegroepeerd op ID

  2. Aankondiging van Barman 1.0, Backup and Recovery Manager voor PostgreSQL

  3. Vaste waarde splitsen naar landen op basis van dagelijks inkomstenaandeel

  4. Hoe hernoem je iets in SQL Server met vierkante haken in de naam?