django 子组最大值的总和
django aggregate sum of subgroup maximums
我在 Django 中有以下简化设置,使用 MySQL:
class Category(models.Model):
name = models.CharField(max_length=255)
class MyTable(models.Model):
category = models.ForeignKey('Category', on_delete=models.CASCADE)
date = models.DateField()
amount = models.IntegerField()
class Meta:
unique_together = ['category', 'date']
查询集包含 MyTable
的以下示例数据:
date category_id amount
2017-12-01 3 2
2018-01-01 1 100
2018-02-01 1 50
2018-03-01 2 2000
2018-04-01 2 4000
2018-05-01 3 2
2018-06-01 3 1
我最终想要的是一种获取每个category
对应于最新date
的amount
的总和的方法。举例说明:
category_id
1 的最新 date
是 2018-02-01,其中 amount
是 50;
category_id
2 的最新 date
是 2018-04-01,其中 amount
是 4000;
category_id
3的最新date
是2018-06-01,其中amount
是1;
- 50 + 4000 + 1 = 4051
我想弄清楚如何通过对此查询集的聚合调用来获取值 4051。我已经尝试了我能想到的 "values"、"annotate" 和 "aggregate" 的所有组合,但都没有得到想要的结果。以下为我提供了每个 category
的最新日期,但每次我尝试获取相应 amount
的总和时,它都会在 每个 amount
而不仅仅是最大值。
MyTable.objects.values('category').annotate(Max('date'))
我正在尝试通过 Django 的 ORM 实现吗?我发布了另一个关于此示例的 MySQL 语法的问题,但也无法将其应用于 Django 查询集。
感谢任何指导。
我认为你需要一些数据结构来实现这个如果 Djnago ORM 或 sql 不符合你的要求(无法编写)请看下面的答案
l=[]
x=MyTable.objects.values('category').annotate(date=Max('date'))
for y in x:
qq= MyTable.objects.get(category_id=y.get(category),date=y.get(date))
l=l+qq.amount
total_amount = sum(l)
print(total_amount)
我在 Django 中有以下简化设置,使用 MySQL:
class Category(models.Model):
name = models.CharField(max_length=255)
class MyTable(models.Model):
category = models.ForeignKey('Category', on_delete=models.CASCADE)
date = models.DateField()
amount = models.IntegerField()
class Meta:
unique_together = ['category', 'date']
查询集包含 MyTable
的以下示例数据:
date category_id amount
2017-12-01 3 2
2018-01-01 1 100
2018-02-01 1 50
2018-03-01 2 2000
2018-04-01 2 4000
2018-05-01 3 2
2018-06-01 3 1
我最终想要的是一种获取每个category
对应于最新date
的amount
的总和的方法。举例说明:
category_id
1 的最新date
是 2018-02-01,其中amount
是 50;category_id
2 的最新date
是 2018-04-01,其中amount
是 4000;category_id
3的最新date
是2018-06-01,其中amount
是1;- 50 + 4000 + 1 = 4051
我想弄清楚如何通过对此查询集的聚合调用来获取值 4051。我已经尝试了我能想到的 "values"、"annotate" 和 "aggregate" 的所有组合,但都没有得到想要的结果。以下为我提供了每个 category
的最新日期,但每次我尝试获取相应 amount
的总和时,它都会在 每个 amount
而不仅仅是最大值。
MyTable.objects.values('category').annotate(Max('date'))
我正在尝试通过 Django 的 ORM 实现吗?我发布了另一个关于此示例的 MySQL 语法的问题,但也无法将其应用于 Django 查询集。
感谢任何指导。
我认为你需要一些数据结构来实现这个如果 Djnago ORM 或 sql 不符合你的要求(无法编写)请看下面的答案
l=[]
x=MyTable.objects.values('category').annotate(date=Max('date'))
for y in x:
qq= MyTable.objects.get(category_id=y.get(category),date=y.get(date))
l=l+qq.amount
total_amount = sum(l)
print(total_amount)