下面有两个SQL查询的区别是什么

时间:2018-07-09 08:07:12

标签: mysql sql database

select 
    substr(insert_date, 1, 14), 
    device, count(1) 
from 
    abc.xyztable   
where 
    insert_date >= DATE_SUB(NOW(), INTERVAL 10 DAY) 
group by 
    device, substr(insert_date, 1, 14) ;

然后我试图获取上面得到的相同行数的平均值。

SELECT 
    date, device, AVG(count) 
FROM
    (SELECT 
         substr(insert_date, 1, 14) AS date,
         device,
         COUNT(1) AS count 
     FROM
         abc.xyztable
     WHERE
         insert_date >= DATE_SUB(NOW(), INTERVAL 10 DAY) 
     GROUP BY
         device, substr(insert_date, 1, 14)) a
 GROUP BY 
     device, date;

当我发现两个查询都返回相同的结果时,我尝试了最近10天的数据。

我的目的是获取从上述第一个查询中获得的最近10天的平均行数。

2 个答案:

答案 0 :(得分:0)

如果想要平均值,则需要更改最后一个GROUP BY

获取每台设备的平均值

GROUP BY device;

获取每个日期的平均值

GROUP BY date;

或完全删除它以获得子查询中所有行的平均值

更新 下面是获取每个设备平均值的完整示例

SELECT device, avg(count)
FROM (SELECT substr(insert_date,1,14) as date, device, count(1) as count 
      FROM abc.xyztable
      WHERE insert_date >=DATE_SUB(NOW(), INTERVAL 10 DAY) 
      GROUP BY device,substr(insert_date,1,14)) a
GROUP BY device;

答案 1 :(得分:0)

我不确定您要问的是什么,根据HoneyBadger的评论,两个查询之间的“区别”是第一个查询有效,但第二个查询似乎无效。他们似乎还试图实现两个不同的目标。

但是,我认为您要尝试做的是根据第一个查询的数据生成一个查询,该查询返回日期,设备和count列的平均值。如果是这样,我相信以下查询将对此进行计算:

WITH
   dataset AS (
       select substr(insert_date,1,14) AS theDate, device, count(*) AS 
       theCount 
       from abc.xyztable
       where insert_date >=DATE_SUB(NOW(), INTERVAL 10 DAY) 
       group by device,substr(insert_date,1,14)
       )

       SELECT theDate, device, (SELECT ROUND(AVG(CAST(theCount 
       AS FLOAT)), 2) FROM 
       dataset) AS Average
       FROM dataset
       GROUP BY theDate, device

我已参考此问题的可接受答案来计算平均值:How to calculate average of a column and then include it in a select query in oracle? 这个问题可以整理查询:Formatting Clear and readable SQL queries

在没有数据样本或任何适当上下文的情况下,我看不到这将如何特别有用,因此,如果不是您要找的内容,请编辑问题并明确说明您的需求。

编辑:根据您提供的其他信息,我对解决方案进行了调整,以提高平均列的精度。现在,它计算平均值到小数点后两位。您已经说过,这将返回与原始查询相同的结果,但是两个查询的公式并不相同。如果计数列始终是相同的数字,变化很小,则AVG函数将对此进行四舍五入,进而可以产生看起来相同的结果,特别是如果您仅比较一个小样本,那么我有修改了我的答案以证明这一点。同样,如果您想提供更多信息(例如数据样本),我们都会帮助您更加轻松。