两个SQL查询之间的差异

两个SQL查询之间的差异,sql,sql-server,Sql,Sql Server,我正在编写一个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_A

我正在编写一个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

第一个查询是对dbo.Table中的所有行求平均值——它取前50个平均值,但只有一个值


第二个查询是对排名前50位的行进行排序,然后取平均值。第二个查询是您想要的。

第一个查询是对dbo.Table中的所有行求平均值-它取前50个平均值,但只有一个值


第二个查询是对排名前50位的行进行排序,然后取平均值。第二个查询是您想要的。

实际上它们都不正确。他们都在使用TOP,但没有orderby。这意味着您无法知道哪50行包含在平均值中。在这两个示例中,您都没有得到50行,因为您不使用GROUP BY top 50平均值,但这里只有一行,或者top 50平均值。@SeanRange-我相信您在这里是正确的,更新的查询应该是:从SELECT TOP50 COL1中选择AVGCOL1,dbo中的时间戳。表顺序按时间戳描述为COL1_avg最好更新问题,而不是注释,以便其易读。但是,第一个查询得到前50行的平均值,第二个查询得到前50行的平均值。它们不是一回事。他们应该得到不同的值,我们无法判断哪一个是正确的,因为只有你知道你在这里试图做什么。实际上,他们两个都不正确。他们都在使用TOP,但没有orderby。这意味着您无法知道哪50行包含在平均值中。在这两个示例中,您都没有得到50行,因为您不使用GROUP BY top 50平均值,但这里只有一行,或者top 50平均值。@SeanRange-我相信您在这里是正确的,更新的查询应该是:从SELECT TOP50 COL1中选择AVGCOL1,dbo中的时间戳。表顺序按时间戳描述为COL1_avg最好更新问题,而不是注释,以便其易读。但是,第一个查询得到前50行的平均值,第二个查询得到前50行的平均值。它们不是一回事。他们应该得到不同的值,我们无法判断哪一个是正确的,因为只有你知道你在这里要做什么。看起来这在识别两者之间的差异方面是正确的,这是有意义的。看起来这在识别两者之间的差异方面是正确的,这是有意义的