Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

550
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda