如何 select 来自数据库 table 的 4 个同样大小的结果集
How to select 4 equally sized result sets from database table
我有一个 SQL 服务器数据库 table,它有很多行。我正在使用一个将 table 用作数据源的程序。该程序本身不支持多线程,因此我必须 运行 程序的多个实例,并且对于每个实例,我都需要告知要处理整个基础数据的哪一部分。
我一直在使用这条语句将我的基础数据(来自 table 的数据)分割成两个大小相等的结果集:
SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField ASC
所以这将是 select 前 50% 的数据。然后我使用以下语句 return 另一半:
SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField DESC
但我不知道如何 select,比方说,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
所以它将 return 其他所有内容,但不包括前 25% 或后 50%。所以换句话说,它将 return 数据介于 25% 行和 50% 之间。你明白我的意思了。
我在我的本地机器上试过这个(在 Visual Studio 连接到我的 SQL 数据库)并且它运行良好但是当我在测试环境中实现它时我收到以下错误
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
我真的不知道在这种情况下这意味着什么。这些 SELECT TOP 50 PERCENT
语句在测试环境中也能很好地工作。
您应该查看 NTILE
window 函数 - 它将一组行分成块(任意数量 - 您决定)并允许您轻松选择所需的行:
WITH ChunkedData AS
(
SELECT
Chunk = NTILE(4) OVER (ORDER BY MyField ASC),
*
FROM MyTable
)
SELECT *
FROM ChunkedData
WHERE Chunk = 1
使用 NTILE(4)
window 函数,您基本上可以将所有行标记为 1、2、3 或 4 - 4 几乎相等的数据块。选择您需要的那个 - 很有魅力!
当然,如果需要,您可以使用其他数量的块 - NTILE(10)
给你 10 个同样大小的块 - 你的选择。
当你写条件如 column_name 'in' 或 'not in' 时,子查询应该 return 只有一列作为比较结果。
在您的子查询中,您正在 returning 所有列,因此无法比较..请尝试下面的查询
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
我有一个 SQL 服务器数据库 table,它有很多行。我正在使用一个将 table 用作数据源的程序。该程序本身不支持多线程,因此我必须 运行 程序的多个实例,并且对于每个实例,我都需要告知要处理整个基础数据的哪一部分。
我一直在使用这条语句将我的基础数据(来自 table 的数据)分割成两个大小相等的结果集:
SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField ASC
所以这将是 select 前 50% 的数据。然后我使用以下语句 return 另一半:
SELECT TOP 50 PERCENT *
FROM MyTable
ORDER BY MyField DESC
但我不知道如何 select,比方说,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
所以它将 return 其他所有内容,但不包括前 25% 或后 50%。所以换句话说,它将 return 数据介于 25% 行和 50% 之间。你明白我的意思了。
我在我的本地机器上试过这个(在 Visual Studio 连接到我的 SQL 数据库)并且它运行良好但是当我在测试环境中实现它时我收到以下错误
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
我真的不知道在这种情况下这意味着什么。这些 SELECT TOP 50 PERCENT
语句在测试环境中也能很好地工作。
您应该查看 NTILE
window 函数 - 它将一组行分成块(任意数量 - 您决定)并允许您轻松选择所需的行:
WITH ChunkedData AS
(
SELECT
Chunk = NTILE(4) OVER (ORDER BY MyField ASC),
*
FROM MyTable
)
SELECT *
FROM ChunkedData
WHERE Chunk = 1
使用 NTILE(4)
window 函数,您基本上可以将所有行标记为 1、2、3 或 4 - 4 几乎相等的数据块。选择您需要的那个 - 很有魅力!
当然,如果需要,您可以使用其他数量的块 - NTILE(10)
给你 10 个同样大小的块 - 你的选择。
当你写条件如 column_name 'in' 或 'not in' 时,子查询应该 return 只有一列作为比较结果。 在您的子查询中,您正在 returning 所有列,因此无法比较..请尝试下面的查询
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