Django 按查询分组

Posted

技术标签:

【中文标题】Django 按查询分组【英文标题】:Django Group by query 【发布时间】:2014-08-27 21:52:01 【问题描述】:

我有一个包含以下列的表格:

class Table1(models.Model):
    avg_value=models.CharField('Avg Value',)
    sys_timestamp = models.IntegerField('SYS Timestamp')

现在我想做这个 mysql 查询:

select max(id), avg_value, sys_timestamp from Table1 group by sys_timestamp order by id desc limit 10;

我只想要结果中的 max_id 和 avg_value 和 sys_timestamp 如果可能,仅使用 sys_timestamp 和 avg_value 示例[[1404385800L,-34],[1404385500L,-45].............] 使用 Django ORM 将 group_by 设置为仅 sys_timestamp。

我尝试了以下方法,但未能获得预期的结果。

Table1.objects.values_list('sys_timestamp','avg_value').annotate(max_id=Max('id')).order_by('-id')[:10]

如果我这样做:

    print (Table1.objects.values_list('sys_timestamp','avg_value').annotate(max_id=Max('id')).order_by('-id')[:10]).query

SELECT Table1.sys_timestamp, Table1.avg_value, MAX(Table1.id) AS max_id FROM Table1 GROUP BY Table1.sys_timestamp, Table1.avg_value ORDER BY Table1.id DESC LIMIT 10

order_by 是sys_timestampavg_value,这不是必需的。

如果我这样做:

(PerformanceService.objects.only('avg_value','sys_timestamp').values('sys_timestamp').annotate(max_id=Max('id')).order_by('-id')[:6]).query

SELECT Table1.sys_timestamp, MAX(Table1.id) AS max_id FROM Table1 GROUP BY Table1.sys_timestamp ORDER BY Table1.id DESC LIMIT 6

这个回报:

['sys_timestamp': 1404385800L, 'max_id': 7380, 'sys_timestamp': 1404385500L, 'max_id': 7370, 'sys_timestamp': 1404385200L, 'max_id': 7360.............]

但要求是

['sys_timestamp': 1404385800L, 'max_id': 7380, avg_value:-34, 'sys_timestamp': 1404385500L, 'max_id': 7370, avg_value:-39, 'sys_timestamp': 1404385200L, 'max_id': 7360, avg_value:-23.............]

任何想法。 ?

【问题讨论】:

【参考方案1】:

您表示要实现此查询:

select max(id), avg_value, sys_timestamp from Table1 group by sys_timestamp order by id desc limit 10;

您想要的在技术上是错误的。您不能在 SELECT 子句中使用不在 GROUP BY 子句中的列(可能有多个 avg_valuesys_timestamp 关联)。

如果您确定每个 sys_timestamp 都只有一个 avg_value,您可以这样做:

Table1.objects.values('sys_timestamp').annotate(max_id=Max('id'), avg_val=Max('avg_value')).order_by('-max_id')[:10]

请注意,我使用 Max('avg_value') 作为 hack,它等于唯一的 avg_value

【讨论】:

以上是关于Django 按查询分组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 查询集按小时对对象进行分组?

Django 查询 - 是不是可以在数据库级别按公共字段对元素进行分组?

相当于按年分组的Django ORM查询集?

Django 09-1模型层 查询(分组聚合)

按外键/相关字段分组 django 查询集

django 中的聚合函数,分组函数,F 查询, Q查询