计数时合并行 - Django/SQL

发布于 2024-10-15 19:10:10 字数 461 浏览 0 评论 0原文

我有以下模型:

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组合计数


有什么想法吗?

I have the following model:

class Item(models.Model):

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

I would like to get:

  • the count of the different category_codes used

  • count of the different unique_codes used

  • count of the different combination of category_code and unique_code used


Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

述情 2024-10-22 19:10:10

根据要求的 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()

Django/SQL solution as requested:

the count of the different category_codes used:

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

count of the different unique_codes used:

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

count of the different combination of category_code and unique_code used:

codes_cnt = Item.objects.values('category_codes', 'unique_codes').distinct().count()
溺ぐ爱和你が 2024-10-22 19:10:10

不要浪费太多时间尝试巧妙地设计一个很酷的 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 和计数。在Python中,我们可以根据我们的应用程序假设一些事情,并且
我们对数据的了解。例如,在这种情况下,我假设它都适合
记忆中。 RDBMS 内部算法无法做出的假设。]

Don't waste too much time trying finesse a cool SQL solution.

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

That will do it. And it will work reasonably quickly. Indeed, if you do some benchmarking, you may find that -- sometimes -- it's as fast as a "pure SQL" statement.

[Why? Because RDBMS must use a fairly inefficient algorithm for doing GROUP BY and Counts. In Python we have the luxury of assuming some things based on our application and
our knowledge of the data. In this case, for example, I assumed that it would all fit
in memory. An assumption that cannot be made by the RDBMS internal algorithms.]

ペ泪落弦音 2024-10-22 19:10:10
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
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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文