如何将记录从一个表中均匀地分成4个表?

时间:2016-04-07 12:46:22

标签: sql sql-server ssis rowcount

我必须设计一个解决方案,帮助我从1个主表中将数据加载到4个表中。

该功能或包应该做的所有事情如下:

  • 计算主表中的总行数
  • 除以4
  • 加载到表1,2,3和4中。

每次运行程序时,此函数都会清除4个表并再次执行上述过程,主表和目标表的名称将始终相同。

例如,如果主表有4200条记录,那么:

  • 表A将获得1-1000
  • 表B将获得1001-2000
  • 表C将获得2001-3000
  • 表D将获得3001-4200。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

这是一种非常简单的方法。可能有更快的方法。将[TABLE]替换为表的名称,将[ID]替换为表中唯一列的名称。

DECLARE @count int = 0;
DECLARE @numRecsPerTable int = 0;

SELECT @count = COUNT(*) FROM [TABLE]
SELECT @numRecsPerTable = @count / 4

SELECT TOP (@numRecsPerTable) * 
INTO temp_1
FROM [TABLE]

SELECT TOP (@numRecsPerTable) * 
INTO temp_2
FROM [TABLE]
WHERE [ID] NOT IN (SELECT TOP (@numRecsPerTable) [ID] FROM [TABLE])

SELECT TOP (@numRecsPerTable) * 
INTO temp_3
FROM [TABLE]
WHERE [ID] NOT IN (SELECT TOP (@numRecsPerTable * 2) [ID] FROM [TABLE])

SELECT * 
INTO temp_4
FROM [TABLE]
WHERE [ID] NOT IN (SELECT TOP (@numRecsPerTable * 3) [ID] FROM [TABLE])

注意:recs / 4的剩余部分将在第4个表中。

答案 1 :(得分:0)

SSIS的实施类似于史蒂夫的回答。

enter image description here

来源

第一个区别是,我们将使用模运算符%而不是除法,它在除法后生成余数。在这个例子中,我使用%4,这意味着我将有0,1,2和3的值。四个“桶”的数据。为了给模数运算符一些工作,我使用ROW_NUMBER函数生成一个任意单调递增的数字序列。

查询看起来像

SELECT
    T.* 
,   (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) % 4 AS bucketNumber 
FROM 
    sys.all_columns AS T;

条件分割

我将数据路由到条件分割组件。在这里,您可以定义布尔表达式并将它们与命名输出相关联。我将我的定义为Bucket0,Bucket1,Bucket2,Bucket3以及bucketNumber==0使用的表达式...

目标

我现在有4个连接器来自我的条件分割,并将它们连接到表Bucket0到Bucket3。