【问题标题】:django queryset aggregation count counting wrong thingdjango queryset 聚合计数计数错误
【发布时间】:2019-03-25 05:25:15
【问题描述】:

这是来自:
Django queryset get distinct column values with respect to other column 的后续问题

我的问题:

在 Django 中使用聚合计数会在查询集中计算错误的东西,或者据我所知,甚至在我的查询集中都没有。

我做了什么 我用过:

queryset.order_by('col1', 'col2').distinct('col1', 'col2').values('col2')

获取模型的col2 的值,其中所有行在(col1, col2) 中都有一对不同的值。上面的链接中有一个示例。我打印了我的查询集,看起来不错,我有

[{'col2': value1}, ... , {'col2': value1},{'col2': value2}, ..., {'col2': value2},...]

我现在想计算我得到的查询集中每个值出现了多少。我使用聚合计数来做到这一点。我有:

a = {'count': Count(F(col2), distinct=False)}
queryset.annotate(**a)

我也用 ``distinct=True` 尝试过,但没有运气

我希望得到[{col2:value1, count: num1}, {col2:value2, count: num2} ...]。
相反,我得到[{col2: value1, count: num11}, {col2: value1, count: num12}, ... ,{col2: value1, count: num_1n}, {col2: value2, count: num21}, ... ,{col2: value1, count: num_2n}, ...]。 据我所知,num11, ...., num_1n 是 col2 中存在的行 value1 以及 col1 中的任何特定值的行数,在我之前在准备查询时使用order_by('col1', 'col2').distinct('col1', 'col2').values('col2')。

我不知道是什么原因造成的。我尝试查看queryset.query 参数,但我不明白我哪里出错了。

任何帮助将不胜感激。

【问题讨论】:

  • 你不应该Count(F('col1'))吗?

标签: python django django-queryset django-aggregation


【解决方案1】:

.order_by 应仅指定 'col2',例如:

queryset.values('col2').annotate(
    count=Count('col1', distinct=True)
).order_by('col2')

因此,这将产生一个QuerySet,如下所示:

< QuerySet [
    {'col2': 1, 'count': 4 },
    {'col2': 2, 'count': 2 }
]>

这意味着col1 有四个不同 值,给定col2 有值1,而col1 有两个不同值给定col2 有值2 .

这将构造如下查询:

SELECT col2, COUNT(DISTINCT col1) AS count
FROM some_table
GROUP BY col2
ORDER BY col2

.distinct(..) 在这里不是必要的,因为由于GROUP BY 我们只会获得不同的col2 值,并且因为我们COUNT(DISTINCT ..) 这意味着每个不同 col1 的值只计算一次。

【讨论】:

  • 谢谢!我一整天都在努力让这件事正常工作,而你在 10 分钟内就为我解决了这个问题!你太棒了!
猜你喜欢
  • 2019-08-05
  • 2021-12-13
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2011-09-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多