【发布时间】: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