SQL服务器:创建一批员工并防止一个员工进入多个批次

SQL Server : create batch of Employees and prevent one emp going to multiple batches

我的 table 包含关于 Employee 的数据。然而,它是一个临时 table 并且 EmployeeID 这里不是主键。 table 可能多次包含给定的 EmployeeID

现在,我要 select 批 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 开始。那么这个员工将在第一批和第二批。也就是说,同一员工被发送到多个线程,可能会导致冲突。 虽然这种情况非常罕见,但我必须避免这种情况。

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

平均 RowNumber>=1 和 RowNumber<=200 之间 所以下一批应该是

RowNumber BETWEEN 201 AND 400

您也可以将 where 子句更改为

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

不好意思之前没听懂,你希望同一个员工聚在一起吗?但可能的总 return 行数不是固定数。希望对您有所帮助。

    ;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 other FilterID             RowsCount
----------- ---------- ----- -------------------- --------------------
2           a          12    1                    1
3           a          13    1                    1
1           a          1     1                    1
4           b          21    2                    4
6           c          31    3                    5
7           c          32    3                    5
5           d          41    4                    7

相同的 employeeid 具有相同的 FilterID,并且 RowsCount 控制 return 行计数。 您应该通过 RowsCount 获取数据,但 rownumber.

例如: 当 RowsCount 在 1 和 5 之间时,实际 return 6 行。 因为 employeeID c 有两行。