Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

552
Views
Suma acumulativa (en ejecución) con django orm y postgresql

¿Es posible calcular la suma acumulativa (en ejecución) usando el orm de django? Considere el siguiente modelo:

 class AModel(models.Model): a_number = models.IntegerField()

con un conjunto de datos donde a_number = 1 . De modo que tengo un número (>1) de instancias de AModel en la base de datos, todas con a_number=1 . Me gustaría poder devolver lo siguiente:

 AModel.objects.annotate(cumsum=??).values('id', 'cumsum').order_by('id') >>> ({id: 1, cumsum: 1}, {id: 2, cumsum: 2}, ... {id: N, cumsum: N})

Idealmente, me gustaría poder limitar/filtrar la suma acumulativa. Entonces, en el caso anterior, me gustaría limitar el resultado a cumsum <= 2

Creo que en postgresql se puede lograr una suma acumulativa usando funciones de ventana. ¿Cómo se traduce esto al ORM?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Como referencia, comenzando con Django 2.0 es posible usar la función Window para lograr este resultado:

 AModel.objects.annotate(cumsum=Window(Sum('a_number'), order_by=F('id').asc()))\ .values('id', 'cumsum').order_by('id', 'cumsum')
over 4 years ago · Santiago Trujillo Report

0

A partir de la respuesta de Dima Kudosh y según https://stackoverflow.com/a/5700744/2240489 , tuve que hacer lo siguiente: eliminé la referencia a PARTITION BY en el sql y la reemplacé con ORDER BY , lo que resultó en.

 AModel.objects.annotate( cumsum=Func( Sum('a_number'), template='%(expressions)s OVER (ORDER BY %(order_by)s)', order_by="id" ) ).values('id', 'cumsum').order_by('id', 'cumsum')

Esto da el siguiente sql:

 SELECT "amodel"."id", SUM("amodel"."a_number") OVER (ORDER BY id) AS "cumsum" FROM "amodel" GROUP BY "amodel"."id" ORDER BY "amodel"."id" ASC, "cumsum" ASC

La respuesta de Dima Kudosh no fue resumir los resultados, pero lo anterior sí.

over 4 years ago · Santiago Trujillo Report

0

Para la posteridad, encontré que esta es una buena solución para mí. No necesitaba que el resultado fuera un QuerySet, por lo que podía permitirme hacer esto, ya que solo iba a trazar los datos usando D3.js:

 import numpy as np import datettime today = datetime.datetime.date() raw_data = MyModel.objects.filter('date'=today).values_list('a_number', flat=True) cumsum = np.cumsum(raw_data)
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!