admin

有没有一种方法可以将选择查询的结果分为两个相等的一半?

sql

我需要在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子句和子查询。


阅读 174

收藏
2021-05-10

共1个答案

admin

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用于下半部分

2021-05-10