Слияние строк при подсчете - Django / SQL - PullRequest
1 голос
/ 01 февраля 2011

У меня есть следующая модель:

class Item(models.Model):

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

Я хотел бы получить:

  • количество различных кодов категорий используемых

  • количество различных уникальных_кодов используемых

  • количество различных комбинаций кодов категорий и уникальных кодов б


Есть идеи?

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Решение Django / SQL по запросу:

количество различных кодов категорий используемых:

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

количество различных уникальных_кодов используемых:

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

количество различных комбинаций кода категории и уникального кода используемых:

codes_cnt = Item.objects.values('category_codes', 'unique_codes').distinct().count()
1 голос
/ 01 февраля 2011

Не тратьте слишком много времени, пытаясь отточить крутое решение 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»

[Почему?Потому что СУБД должна использовать довольно неэффективный алгоритм для выполнения GROUP BY и Counts.В Python мы можем позволить себе некоторые вещи, основанные на нашем приложении и наших знаниях о данных.В этом случае, например, я предполагал, что все это уместится в памяти.Предположение, которое не может быть сделано внутренними алгоритмами СУБД.]

0 голосов
/ 01 февраля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...