【问题标题】:SQL Server : create batch of Employees and prevent one emp going to multiple batchesSQL Server:创建一批员工并防止一个员工进入多个批次
【发布时间】:2017-04-09 13:10:54
【问题描述】:

我的表包含有关Employee 的数据。但是它是一个临时表,EmployeeID 这里不是主键。该表可能多次包含给定的EmployeeID

现在,我必须选择batchSize 的一批记录,我们现在考虑200 条。我会将这些批次发送到多个线程。

我已经写了这个查询:

WITH SingleBatch AS 
(
    SELECT 
        *,
        ROW_NUMBER() OVER(ORDER BY EmployeeId) AS RowNumber
    FROM 
        TemperoryTable
)
SELECT *
FROM SingleBatch
WHERE RowNumber BETWEEN 1 AND 200;

结果可能是:

  EmployeeID  EffectiveDate
1   123        01/01/2016
2   541        01/01/2016
------------------------
------------------------
200 978       18/06/2015

为一批。 这工作正常,行号随线程号而变化。

现在假设,第二批以 EmployeeId 978 开头。那么这个员工将在第一批和第二批。也就是说,同一个员工被发送到多个线程,可能会导致冲突。 虽然这种情况非常罕见,但我必须避免这种情况。

这里有什么可能的解决方案?

【问题讨论】:

  • 将预期结果作为样本数据提供比用文字解释预期结果更容易理解。

标签: sql sql-server vb.net multithreading batch-processing


【解决方案1】:

在平均 RowNumber>=1 和 RowNumber

RowNumber BETWEEN 201 AND 400

您也可以将 where 子句更改为

RowNumber>=1 and  RowNumber <200  (1-199)
RowNumber>=200 and  RowNumber <400 (200-399) 

【讨论】:

  • 感谢您的回答。但这并不能解决问题,因为一名员工的记录可能超过 2 条。它可以是 3、4、5 或更多。如果第 200 名员工是 John,我想在同一线程/批次中获取 John 的所有记录
【解决方案2】:

对不起,我以前没听懂,你希望同一个员工可以聚在一起吗?但可能的总返回行数不是固定数。希望对你有帮助。

    ;WITH t(RowNumber,EmployeeId,other)AS
    (
        SELECT 1,'a','1' UNION ALL
        SELECT 2,'a','12' UNION ALL
       SELECT 3,'a','13' UNION ALL
       SELECT 4,'b','21' UNION ALL
       SELECT 5,'d','41' UNION ALL
       SELECT 6,'c','31' UNION ALL
       SELECT 7,'c','32' 

    )
    SELECT *,DENSE_RANK()OVER(ORDER BY EmployeeId) AS FilterID,RANK()OVER(ORDER BY EmployeeId) RowsCount FROM t
RowNumber EmployeeId 其他 FilterID RowsCount ------------ ---------- ----- -------- ---- ---------------- 2 一 12 1 1 3 一 13 1 1 1 一 1 1 1 4 b 21 2 4 6 c 31 3 5 7 c 32 3 5 5 天 41 4 7

相同的employeeid 具有相同的FilterID,以及用于控制返回行数的RowsCount。 您应该按 RowsCount 但按行数获取数据。

例如: 当 RowsCount 介于 1 和 5 之间时,实际返回 6 行。 因为employeeID c 有两行。

【讨论】:

  • 太棒了..这似乎可以解决我的问题。我会尝试,如果可以,我会接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多