2017-03-08 7 views
0

私はSql Serverを使っています!SQL Serverから条件付きデータを取得する方法は?

私の顧客テーブルには15000件のレコードがあります。そして、次の日に5000レコードを処理して、次の日に5000レコードを処理したいと思います。毎日の操作は限られたレコード数で実行され、顧客表のデータは頻繁に変更されます。また、処理されていない保留中のレコードの数を取得します。これを行う方法をお役立てください。おかげ

は、さらに詳細:

  1. テーブル
  2. フィールドに使用して日時スタンプ:[FIRST_NAME]、[MIDDLE_NAME]、[LAST_NAME]、[作成]、[CREATED_BY]、[CUSTOMER_NUMBER]
+0

テーブルのスキーマを投稿できますか?行が処理されている場合は、datetime stampを保持することをお勧めできますか? IdentityCol ASC –

+0

によってdatetimeprocessedがnull注文であるDataTableからSelect top 5000 *を選択すると、顧客テーブルの変更が日々の処理にどのように影響しますか? –

+0

、[FIRST_NAME] 、[MIDDLE_NAME] 、[姓] 、[作成] 、[CREATED_BY] 、[CUSTOMER_NUMBER] –

答えて

1

最も簡単な方法は、2つの列を追加することです(存在しない場合)。 updated_atおよびprocessed_atupdated_at列は行の更新時に更新されます。 processed_at列は、毎日のジョブでその行を処理し始めたときに更新されます。今あなたのクエリは、何かのようになります。

私はあなたがあなたのテーブルにIDのいくつかのフォームを持っていると仮定するつもりです
select * from your_table where updated_at > processed_at limit 5000; 
1

...

だから、私は「を使用しています(あなたの手順で開始日を設定し、それに比較2016- 01-01 '):

with CTE as 
(
select t1.*, row_number() over(order by customer_id) as r_ord 
from Mytable t1 
) 
select CTE.* 
from CTE 
where (mod(datediff(day, '2016-01-01', getdate()),3) = 0 and r_ord <= 5000) 
or (mod(datediff(day, '2016-01-01', getdate()),3) = 1 and r_ord between 5001 and 10000) 
or (mod(datediff(day, '2016-01-01', getdate()),3) = 2 and r_ord > 10000) 
関連する問題