PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използване на анотация на Django Window в комбинация с различна клауза

Мисля, че основният проблем е, че смесвате операции, които се използват в анотация, генерира групиран набор от заявки, като sum, с операция, която просто създава ново поле за всеки запис в дадения набор от заявки, като yesterday_count=Window(expression=Lag("count")) .

Така че подреждането наистина има значение тук. Така че, когато опитате:

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

Резултатът от заявката е просто WidgetCount.objects.distinct("date") с анотация, не се извършва групиране.

Бих предложил да отделите вашите операции, така че да стане по-лесно да разберете какво се случва, и забележете, че итерирате обекта на python, така че не е необходимо да правите нови заявки!

Забележка при използването на операция SUM като пример, защото получавам неочаквана грешка с оператора FirstValue. Така че публикувам със Sum, за да демонстрирам идеята, която остава същата. Идеята трябва да е същата за първата стойност само чрез промяна на acc_count=Sum("count") към 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)

ИЗХОД:

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

Оказва се, че операторът FirstValue изисква да използвате функция на Windows, така че да не можете да вложите FirtValue и след това да изчислите Lag, така че в този сценарий не съм съвсем сигурен дали можете да го направите. Въпросът е как да получите достъп до колоната First_Value без вложени прозорци.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TypeORM FindOperators с трансформатор

  2. Надстройка до PostgreSQL 11 с логическа репликация

  3. Защо мога да създам таблица с PRIMARY KEY в колона с нула?

  4. PostgreSQL Upsert (при конфликт) със същите стойности в Insert и Update

  5. свързване на postgresql и codeigniter