我有一个SQL Server数据库表,它有很多行。我正在使用一个程序,它使用该表作为数据源。程序本身不支持多线程,所以我必须运行程序的多个实例,对于每个实例,我需要说明要处理的整个基本数据的哪一部分。
我一直在使用这个语句将我的基本数据(表中的数据)分割成两个大小相等的结果集:
SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField ASC因此,这将选择前50%的数据。然后,我使用以下语句返回另一半:
SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField DESC但我不知道如何选择,比如说,25%的块。我试过像这样
SELECT *
FROM MyTable
WHERE MyField NOT IN (SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField DESC)
AND MyField NOT IN (SELECT TOP 25 PERCENT *
FROM MyTable
ORDER BY MyField ASC)
ORDER BY MyField ASC因此,它将返回所有其他东西,但不是前25%或最后50%。换句话说,它将返回25%到50%之间的数据。你明白我的意思。
我在本地机器(在连接到SQL数据库的Visual中)尝试了这一点,并且运行良好,但是当我在测试环境中实现这一点时,我得到了以下错误
当子查询未引入EXISTS时,只能在select列表中指定一个表达式。
在这种情况下,我真的不知道这意味着什么。这些SELECT TOP 50 PERCENT语句在测试环境中也能很好地工作。
发布于 2015-01-15 19:14:56
您应该查看NTILE窗口函数--它将一组行划分为块(任意数量的行--由您决定),并允许您轻松地选择所需的行:
WITH ChunkedData AS
(
SELECT
Chunk = NTILE(4) OVER (ORDER BY MyField ASC),
*
FROM MyTable
)
SELECT *
FROM ChunkedData
WHERE Chunk = 1使用NTILE(4)窗口函数,基本上可以将所有行标记为1、2、3或4-4几乎相等的数据块。选一个你需要的
当然,如果你需要,你可以使用其他数量的块- NTILE(10)给你10个大小相等的块-你的选择。
发布于 2015-01-15 20:17:14
当您编写像column_name 'in‘或'not in’这样的条件时,子查询应该只返回一列作为比较的结果。在子查询中,您将返回所有列,因此无法进行比较。请尝试以下查询
SELECT *
FROM MyTable
WHERE MyField NOT IN (SELECT TOP 50 PERCENT MyField
FROM MyTable
ORDER BY MyField DESC)
AND MyField NOT IN (SELECT TOP 25 PERCENT MyField
FROM MyTable
ORDER BY MyField ASC)
ORDER BY MyField ASChttps://stackoverflow.com/questions/27971082
复制相似问题