【问题标题】:Django Group by queryDjango 按查询分组
【发布时间】: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}.............]

任何想法。 ?

【问题讨论】:

    标签: mysql django python-2.7 django-orm


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2011-05-08
      • 2015-09-07
      相关资源
      最近更新 更多