Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.6+;MySQL:键入Cast MySQL变量以搜索Max,Avg_Mysql_Django_Django Orm_Django Aggregation - Fatal编程技术网

Django 1.6+;MySQL:键入Cast MySQL变量以搜索Max,Avg

Django 1.6+;MySQL:键入Cast MySQL变量以搜索Max,Avg,mysql,django,django-orm,django-aggregation,Mysql,Django,Django Orm,Django Aggregation,我的模型有点像 class ServiceUtilization(models.Model): device_name = models.CharField() service_name = models.CharField() data_source = models.CharField() current_value = models.CharField() sys_timestamp = models.IntegerField() 现在,这里current\u value表示存储为Var

我的模型有点像

class ServiceUtilization(models.Model):
device_name = models.CharField()
service_name = models.CharField()
data_source = models.CharField()
current_value = models.CharField()
sys_timestamp = models.IntegerField()
现在,这里
current\u value
表示存储为VarChar的浮点值,w.r.t存储为unixtime的时间

在尝试获取当前值的最大值和平均值时,我得到了意想不到的结果,因为对于最大值,MySQL将进行基于字符串的比较,其中在
'100'值<'9.99'
中,浮点数中的w.r.t值不正确

我试过:

perf = ServiceUtilization.objects.filter(
        device_name__in=devices,
        service_name__in=services,
        data_source__in=data_sources,
        sys_timestamp__gte=start_date,
        sys_timestamp__lte=end_date
    ).values(
        'device_name',
        'service_name',
        'data_source'
    ).annotate(
        max_val=Max('current_value'),
        avg_val=Avg('current_value')
    )
它提供了不正确的结果

然后看看:

我考虑为查询集提供
extra

perf = ServiceUtilization.objects.extra(
       select={
          'max_val': "MAX(CAST(current_value AS SIGNED))",
          'avg_val': "AVG(CAST(current_value AS SIGNED))"
       }
       ).filter(
        device_name__in=devices,
        service_name__in=services,
        data_source__in=data_sources,
        sys_timestamp__gte=start_date,
        sys_timestamp__lte=end_date
    ).values(
        'device_name',
        'service_name',
        'data_source',
        'max_val',
        'avg_val'
    )
但这只是提供了一个单一的值,而不是期望的结果。这可以翻译成SQL作为

SELECT (MAX(CAST(current_value AS SIGNED))) AS `max_val`, (AVG(CAST(current_value AS SIGNED))) AS `avg_val`, `performance_utilizationstatus`.`device_name`, `performance_utilizationstatus`.`service_name`, `performance_utilizationstatus`.`data_source`
performance\u utilizationstatus
ORDER BY
performance\u utilizationstatus
sys\u timestamp
DESC

但是工作代码需要一个组(设备名称、服务名称、数据源)

性能利用状态
设备名称,
性能利用状态
服务名称,分组,
性能\使用状态
数据\源
订单依据
performance\u utilizationstatus
sys\u timestamp
DESC

如何添加GROUPBY子句

使用
注释
在这里不起作用

1111,“组功能的使用无效”

错误1056(42000):无法在“最大值”上分组。


原始SQL是这里的最后手段吗

我认为您必须使用
.raw
,因为在这里不可能使用
.extra

问题是因为
Django
没有
.groupby
唯一的方法是使用
.values
.annotation
。(正如您在第一次尝试中所做的那样)

所以。。为什么不能使用
.extra
?因为:

在values()调用之后进行的任何额外()调用都将有其额外的 已忽略选定字段

如果在额外()调用后使用values()子句,则定义的所有字段 通过extra()中的select参数,必须在 values()调用

因此,获取
.extra
字段的唯一方法是将它们添加到
.values
中,但这将导致按此字段分组,这是一种不希望出现的行为

SELECT (MAX(CAST(current_value AS SIGNED))) AS `max_val`, (AVG(CAST(current_value AS SIGNED))) AS `avg_val`, `performance_utilizationstatus`.`device_name`, `performance_utilizationstatus`.`service_name`, `performance_utilizationstatus`.`data_source`  FROM `performance_utilizationstatus`