【问题标题】:How to split records evenly into 4 tables from one table?如何将记录从一张表中平均分成四张表?
【发布时间】:2016-07-28 08:40:51
【问题描述】:

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

函数或包应该做的所有事情如下:

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

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

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

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

谁能帮帮我?

【问题讨论】:

  • 您只需要标记您正在使用的sql引擎。我怀疑这在 mysql 和 sql-server 上都存在
  • 利用row_number()
  • 此表是否包含标识字段?
  • 是的,列名本身就是“主键”。

标签: sql sql-server ssis rowcount


【解决方案1】:

这是一种非常简单的方法。可能有更快的方法。将 [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 个表中。

【讨论】:

  • 嗨史蒂夫,感谢这个非常有效的解决方案。现在尝试放入某种形式的 ssis 包或 procuder
【解决方案2】:

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

来源

第一个区别是我们将使用模运算符%而不是除法,它生成除法后的余数。在此示例中,我使用%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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 2017-08-23
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多