我需要在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

09-30 12:13