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_timestamp
和avg_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_value
与 sys_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 按查询分组的主要内容,如果未能解决你的问题,请参考以下文章