我有一个表:如何构建在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行,仍然取平均值,但平均交流不管它有多少行。
我有一个表:如何构建在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行,仍然取平均值,但平均交流不管它有多少行。
试试这个:
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)
首先挑选出30行,选择从得到的平均值:
select avg(A), avg(B), avg(C), avg(D)
from (
select top 30 A, B, C, D
from TheTable
order by ID
) x
我不会做整个查询(像选择排名前30位的平均值(a),平均值(b)等)应该可以工作,但为了照顾排序,确保您的ID列是一个聚集索引可能是最简单的,这将确保您的订购。
聚集索引当然是宝贵的资源,你需要评估你是否需要它到别的地方。
***无视我的“答案”,这是不正确的(见下面的评论)
其实,有一个聚集索引并不保证结果的排序,这种行为与(IIRC)的SQL Server下跌2000. – Guffa 2009-08-25 21:02:47
有趣。他们在哪里记录? – user29117 2009-08-25 21:10:35
明白了..这里良好的信息: 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