计数时合并行 - Django / SQL

时间:2011-02-01 17:42:07

标签: python sql django postgresql django-models

我有以下型号:

class Item(models.Model):

    unique_code = models.CharField(max_length=100)
    category_code = models.CharField(max_length=100)
    label = models.CharField(max_length=100)

我想得到:

  • 使用的 category_codes 的计数

  • 使用的 unique_codes 的计数

  • 使用的 category_code和unique_code 组合的计数


有什么想法吗?

3 个答案:

答案 0 :(得分:3)

按要求提供Django / SQL解决方案:

使用的不同 category_codes 的计数:

category_codes_cnt = Item.objects.values('category_codes').distinct().count()

使用的 unique_codes 的计数:

unique_codes_cnt = Item.objects.values('unique_codes').distinct().count()

使用的 category_code和unique_code 组合的计数:

codes_cnt = Item.objects.values('category_codes', 'unique_codes').distinct().count()

答案 1 :(得分:1)

不要浪费太多时间来尝试精巧的SQL解决方案。

from collections import defaultdict
count_cat_code = defaultdict(int)
count_unique_code = defaultdict(int)
count_combo_code = defaultdict(int)
for obj in Item.objects.all():
    count_cat_code[obj.category_code] += 1
    count_unique_code[obj.unique_code] += 1
    count_combo_code[obj.category_code,obj.unique_code] += 1

那就行了。它会很快地运作。实际上,如果你做一些基准测试,你可能会发现 - 有时候 - 它和“纯SQL”语句一样快。

[为什么呢?因为RDBMS必须使用相当低效的算法来执行GROUP BY和Counts。在Python中,我们可以根据我们的应用程序假设一些东西 我们对数据的了解。在这种情况下,例如,我认为它都适合 在记忆中。 RDBMS内部算法无法做出的假设。]

答案 2 :(得分:0)

select count(distinct unique_code) as unique_code_count,
       count(distinct category_code) as category_code_count,
       count(*) as combination_count
from (select unique_code, category_code, count(*) as combination_count
      from item
      group by unique_code, category_code) combination