我需要在Sql Server 2005中进行选择查询的解决方案。
我想查询返回两个结果集,每个结果集恰好包含符合特定条件的所有记录的一半。我尝试将TOP 50 PERCENT与Order By一起使用,但是如果表中的记录数为奇数,则两个结果集中都会显示一条记录。我不想在记录集上重复任何记录。例:
我有一个简单的表,其中包含TheID(PK)和TheValue字段(varchar(10))和5条记录。现在跳过where子句。
SELECT TOP 50 PERCENT * FROM TheTable ORDER BY TheID asc
产生所选ID的1,2,3
SELECT TOP 50 PERCENT * FROM TheTable ORDER BY TheID desc
产生所选ID的3,4,5
3是dup。当然,在现实生活中,查询非常复杂,其中包含大量的where子句和子查询。
最佳答案
SQL Server 2005和类似的:
select *, ntile(2) over(order by theid) as tile_nr from thetable
ntile(n)
将输出分为n个段,每个段的大小相同(当行数不能被n整除时,取整或取整)。这样就产生了输出:1 | value1 | 1
2 | value2 | 1
3 | value3 | 1
4 | value4 | 2
5 | value5 | 2
如果只需要上半部分或下半部分,则需要将其放入子查询中,例如:
select theid, thevalue from (
select theid, thevalue, ntile(2) over(order by theid) as tile_nr from thetable
) x
where x.tile_nr = 1
将返回上半部分,类似地,对下半部分使用
x.tile_nr = 2