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 有两行。
我的 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 有两行。