我有一个包含以下列的表:
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}.............]
任何想法。 ?
答案 0 :(得分:0)
您声明要实现此查询:
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
相关联。)
如果您确定每个avg_value
只有一个sys_timestamp
,则可以使用此功能:
Table1.objects.values('sys_timestamp').annotate(max_id=Max('id'), avg_val=Max('avg_value')).order_by('-max_id')[:10]
请注意,我使用Max(' avg_value')作为黑客攻击,等于唯一的avg_value
。