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

z0qdvdin  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(317)
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天的平均行数。

jq6vz3qz

jq6vz3qz1#

如果你想要一个平均值,你需要改变最后一组
平均每台设备

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;
tpxzln5u

tpxzln5u2#

我不完全确定你在问什么,根据霍尼獾的评论,两个查询之间的“区别”是第一个是有效的,但第二个似乎不是。他们似乎也在努力实现两个不同的目标。
但是,我认为您要做的是基于第一个查询的数据生成一个查询,它返回日期、设备和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

我引用了这个问题的公认答案来计算平均值:如何计算列的平均值,然后将其包含在oracle的select查询中?整理查询的问题是:格式化清晰可读的sql查询
如果没有你的数据样本,或任何适当的上下文,我看不出这将如何特别有用,所以如果这不是你要找的,请编辑你的问题,并明确你需要什么。
编辑:根据您提供的额外信息,我对解决方案进行了调整,以提高平均列的精度。它现在将平均值计算到小数点后两位。您已经说过,这将返回与原始查询相同的结果,但是这两个查询的形式不同。如果count列始终是相同的数字,并且变化很小,那么avg函数将对此进行舍入,这反过来会产生看起来相同的结果,特别是如果您只比较一个小样本,那么我已经修改了我的答案来演示这一点。再说一次,如果你能提供更多的信息,比如你的数据样本,我们都可以帮助你更容易。

相关问题