@borisalekseev
extra beginner junior python backend

Как обновить строки одновременно с SELECT DISTINCT?

Добрый день! Если Вы не работаете с django, но разбираетесь в SQL, я также буду очень признателен помощи. С помощью следующего запроса взял все уникальные строки по описанию из базы, а также их частоту и сумму по массе и стоимости, и записал всё это дело в таблицу. Вопрос: могу ли я одновременно с этим проиндексировать первую таблицу, чтобы сразу связать все обычные строки с таблицей уникальных строк? БД - MySQL, Django==3.2.10
## упрощенное описание моделей, достаточное для данной задачи:
class SourceBase(models.Model):
    unique_id = models.IntegerField(primary_key=True)
    tn_ved = models.CharField(max_length=10, blank=True, null=True)
    description = models.CharField(max_length=510, blank=True, null=True)
    statistic_cost = models.DecimalField(max_digits=11, decimal_places=2, blank=True, null=True)
    mass = models.DecimalField(max_digits=13, decimal_places=4, blank=True, null=True)
    date = models.DateField(blank=True, null=True)
    class Meta:
        managed = False
        db_table = 'source_base'

class Distinct28(models.Model):
    unique_id = models.AutoField(primary_key=True)
    description = models.CharField(max_length=510, blank=True, null=True)
    statistic_cost = models.DecimalField(max_digits=18, decimal_places=2, blank=True, null=True)
    mass = models.DecimalField(max_digits=18, decimal_places=2, blank=True, null=True)
    frequency = models.IntegerField(blank=True, null=True)
    class Meta:
        managed = False
        db_table = '28_distinct'
##
## Так выглядит мой запрос.
objs = (MyModel(**j) for j in SourceBase.objects.values('description').filter(tn_ved__startswith=28).annotate(
frequency=Count('*'), statistic_cost=Sum('statistic_cost'), mass=Sum('mass')).order_by('-frequency'))
MyModel.objects.bulk_create(objs, batch_size=100)

Также привожу SQL
SourceBase.objects.values('description').filter(tn_ved__startswith=28).annotate(
frequency=Count('*'), statistic_cost=Sum('statistic_cost'),
mass=Sum('mass')).order_by('-frequency')._query.__str__()

'SELECT `source_base`.`description`, COUNT(*) AS `frequency`, SUM(`source_base`.`statistic_cost`)
AS `statistic_cost`,  SUM(`source_base`.`mass`) AS `mass`
FROM `source_base` WHERE `source_base`.`tn_ved` LIKE BINARY 28%
GROUP BY `source_base`.`description` ORDER BY `frequency` DESC'
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы