下面有两个sql查询有啥区别

Posted

技术标签:

【中文标题】下面有两个sql查询有啥区别【英文标题】:What is difference for below there two sql queries下面有两个sql查询有什么区别 【发布时间】:2018-07-09 08:07:12 【问题描述】:
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 天的平均行数。

【问题讨论】:

那么您的问题到底是什么?你打算用count(1) 做什么? 所以您的问题不是您所说的它们之间的区别,而是如何从第一个查询的计数结果中获取平均值? ate_tag_no,已更新,我使用的是设备而不是这个。 @Sloan Thrasher,它就像 count (*) 一样简单。我的问题是在第一个查询中找到每个结果的平均值。 【参考方案1】:

我不完全确定您在问什么,根据 HoneyBadger 的评论,这两个查询之间的“区别”是第一个有效,但第二个似乎无效。他们似乎也在努力实现两个不同的目标。

但是,我认为您要做的是根据第一个查询中的数据生成一个查询,该查询返回日期、设备和计数列的平均值。如果是这样,我相信以下查询会计算出这个:

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 函数将对其进行四舍五入,从而可能产生看起来相同的结果,特别是如果您只比较一个小样本,所以我有修改了我的答案以证明这一点。同样,如果您能提供更多信息(例如数据样本),我们都能更轻松地为您提供帮助。

【讨论】:

谢谢,但您更新的查询结果与我从第二次获得的结果相同。 @bilalshakir 您已将查询编辑为有效,那么结果有什么问题?它与您想要实现的目标有何不同?【参考方案2】:

如果你想要一个平均值,你需要更改最后一个 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;

【讨论】:

我得到了结果,但这些结果或与第一个查询相同。我只是很困惑如何获得过去 10 天内每台设备的平均数量。 @bilalshakir,我已经用完整的查询更新了我的答案。在我的测试中,它不会返回与您的第一个查询相同的结果。

以上是关于下面有两个sql查询有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle数据库条件查询语句中使用'%%','_%%'这两个有啥区别

内联 SQL 查询和实体框架触发的查询有啥区别?

2个sql查询有啥区别?

SQL数据库中查询语句Order By和Group By有啥区别

sql语句中嵌套时候用in 和=有啥区别

在 Dapper 和实体框架中处理对象的方式有啥区别 - 使用原始 SQL 查询?