2009-08-25 58 views
1

我有一个表:如何构建在T-SQL中,查询

ID A B C D 
1 10 20 30 5 
2 332 80 32 12 
3 41 20 82 42 
. 
. 
. 

我要查询,让我

A B C D 

其中A包含列A的排名前30位的平均按表格ID排序,B包含表格前30行的列B的平均值,按照ID升序排序等。

如果表格少于30行,仍然取平均值,但平均交流不管它有多少行。

回答

3

试试这个:

SELECT AVG (A), AVG(B), AVG(C), AVG(D) 
FROM ThisTable tt 
WHERE tt.ID IN (SELECT TOP 30 ID FROM ThisTable ORDER BY ID ASC) 
6

首先挑选出30行,选择从得到的平均值:

select avg(A), avg(B), avg(C), avg(D) 
from (
    select top 30 A, B, C, D 
    from TheTable 
    order by ID 
) x 
-1

我不会做整个查询(像选择排名前30位的平均值(a),平均值(b)等)应该可以工作,但为了照顾排序,确保您的ID列是一个聚集索引可能是最简单的,这将确保您的订购。

聚集索引当然是宝贵的资源,你需要评估你是否需要它到别的地方。

***无视我的“答案”,这是不正确的(见下面的评论)

+0

其实,有一个聚集索引并不保证结果的排序,这种行为与(IIRC)的SQL Server下跌2000. – Guffa 2009-08-25 21:02:47

+0

有趣。他们在哪里记录? – user29117 2009-08-25 21:10:35

+0

明白了..这里良好的信息: http://www.thejoyofcode.com/Guaranteeing_the_order_of_results_in_SQL_Server.aspx http://blogs.msdn.com/conor_cunningham_msft/archive/2008/08/27/no-seatbelt-期待阶无阶by.aspx – user29117 2009-08-25 21:14:47