我需要在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整除时,取整或取整)。这样就产生了输出:
ntile(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用于下半部分
x.tile_nr = 2