Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从数据库表中选择4个大小相等的结果集_Sql_Sql Server - Fatal编程技术网

Sql 如何从数据库表中选择4个大小相等的结果集

Sql 如何从数据库表中选择4个大小相等的结果集,sql,sql-server,Sql,Sql Server,我有一个SQL Server数据库表,它有很多行。我正在使用一个程序,该程序使用该表作为数据源。程序本身不支持多线程,因此我必须运行程序的多个实例,对于每个实例,我需要告诉整个基础数据的哪一部分要处理 我一直在使用此语句将表中的基本数据分为两个大小相等的结果集: SELECT TOP 50 PERCENT * FROM MyTable ORDER BY MyField ASC 因此,这将选择前50%的数据。然后我用下面的语句返回另一半: SELECT TOP 50 PERCENT * F

我有一个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%行之间的数据。我相信你明白了

我在VisualStudio中的本地机器上尝试了这个方法,它连接到我的SQL数据库,效果很好,但是当我在测试环境中实现这个方法时,我得到了以下错误

当子查询未引入EXISTS时,只能在选择列表中指定一个表达式

我真的不知道在这种情况下这意味着什么。这些SELECT TOP 50%语句在测试环境中也能很好地工作。

您应该看看NTILE窗口函数-它将一组行划分为任意数量的块-您可以决定并允许轻松选择所需的行:

WITH ChunkedData AS
(
    SELECT 
        Chunk = NTILE(4) OVER (ORDER BY MyField ASC),
        * 
    FROM MyTable 
)
SELECT *
FROM ChunkedData
WHERE Chunk = 1
使用NTILE4窗口函数,您基本上可以将所有行标记为1、2、3或4-4几乎相等的数据块。挑一个你需要的-就像一个魅力


当然,如果需要,您可以使用其他数量的块-NTILE10为您提供10个大小相同的块-供您选择。

当您编写列名称“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 ASC

确保选择一个总顺序,以便同一查询的多个执行选择相同的行。应该注意的是,这提供了一个分布式分配-您每N行获得一次,而不是表的顶部/中间/底部N行。我在关键字“FROM”错误附近得到了不正确的语法。我检查了我的代码很多次,它等于一个你张贴。有什么想法吗?@kivikall关于堆栈溢出的示例代码通常并不完美。有时候,你不得不多走一英里,修正一个小错误。@kivikall:对不起,我的代码有一个输入错误,你需要在代码末尾加一个逗号。。线见上文