2016-11-25 4 views
0

私のテーブルにはEmployeeに関するデータが含まれています。ただし、これは一時テーブルで、EmployeeIDはプライマリキーではありません。テーブルには、EmployeeIDを複数回含むことがあります。SQL Server:従業員のバッチを作成し、1つのempが複数のバッチに移動するのを防ぐ

今、私は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 

1つのバッチのために。 これは正常に動作し、行番号はスレッド番号と共に変わります。

ここで、2番目のバッチがEmployeeId 978で始まるとします。その後、この従業員は最初のバッチと2番目のバッチになります。つまり、同じ従業員が複数のスレッドに送られている可能性があります。 シナリオは非常にまれですが、私はこれを避けなければなりません。

可能な解決策は何でしょうか?平均RowNumber関数> = 1とRowNumber関数間

+0

期待される結果をサンプルデータとして提供することは、期待される結果を言葉で説明するよりもはるかに理解しやすくなります。 – Viki888

答えて

1

申し訳ありませんが、私は前にそれを得ることはありません、あなたは同じエモポリを一緒に集めることができますか?可能な総戻り行数は固定数ではありません。これがあなたに役立つかもしれません。

;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 

同じ社員が同​​じFilterIDを持ち、そしてRowsCountはカウント戻り行を制御します。 RowsCountではなくrownumberによってデータを取得する必要があります。

例: 実際の戻り値は、1〜5のRowsCountのときです。 employeeID cには2行があるためです。

+0

Wonderful ..これは私の問題を解決するようだ。私は試してみるだろうし、もしそうなら、私は答えを受け入れるだろう。 – SurajS

0

< = 200 だから、次のバッチも

RowNumber BETWEEN 201 AND 400 

は、あなたが変更することができますする必要があります句に

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

ありがとうございました。しかし、これは1人の従業員の2つ以上のレコードが存在する可能性があるため、問題を解決するものではありません。それは、3,4,5またはそれ以上であり得る。 200番目の従業員がJohnの場合、同じスレッド/バッチでJohnのすべてのレコードを取得したい。 – SurajS

関連する問題