【问题标题】:Difference between two SQL Queries两个 SQL 查询之间的区别
【发布时间】:2015-08-17 18:01:52
【问题描述】:

我正在编写一个 SQL 查询来从一列中选择前 50 个值,然后计算这些值的平均值。我编写了两个查询来完成此操作,但它们给出了两个不同的值。我相信下面的第二个是正确的,但我想知道两者之间有什么不同以及第一个实际计算的是什么(如果我实际上是正确的,那么第二个是正确的)。

第一个查询:

SELECT TOP(50) AVG(COL1) AS COL1_AVG FROM dbo.Table

第二次查询:

SELECT AVG(COL1) FROM (SELECT TOP(50) COL1 FROM dbo.Table) AS COL1_AVG

更新了第二个查询,带有时间戳:

SELECT AVG(COL1) FROM (SELECT TOP(50) COL1 FROM dbo.Table ORDER BY TimeStamp DESC) AS COL1_AVG

【问题讨论】:

  • 其实两者都不对。他们都在使用 TOP 但没有 order by。这意味着您无法知道平均值中包含了哪些 50 行。
  • 在这两个例子中你都没有得到 50 行,因为你没有使用 GROUP By
  • 前 50 名的平均值(但这里只有一个),或前 50 名的平均值。
  • @SeanLange - 我相信你在这里是正确的,更新后的查询应该是:SELECT AVG(COL1) FROM (SELECT TOP(50) COL1, TimeStamp FROM dbo.Table ORDER BY TimeStamp DESC) AS COL1_AVG
  • 更新问题而不是评论会更好,以便清晰易读。但是,您的第一个查询获得前 50 个平均值,而您的第二个查询获得前 50 行的平均值。它们不是同一件事。他们应该得到不同的值,我们无法判断哪个是正确的,因为只有你知道你在这里要做什么。

标签: sql sql-server


【解决方案1】:

第一个查询是对 dbo.Table 中的所有行进行平均——它采用 TOP 50 的平均值,但只有一个值。

第二个查询获取前 50 行(没有特别的排序),然后对它们进行平均。第二个查询就是你想要的。

【讨论】:

  • 看起来这在识别两者之间的差异方面是正确的,这是有道理的
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多