1

このシナリオのような SQL Server の質問を見つけることができませんでした。次の形式のデータがあります。

Recnum    SectionID    CategoryID    EnterTime     LeaveTime
534       2            4             <time here>   <time here>   
535       2            2             <time here>   <time here>  
532       2            2             <time here>   <time here>  
523       2            4             <time here>   <time here>  
512       2            4             <time here>   <time here>  
577       2            NULL          <time here>   <time here>  
578       1            6             <time here>   <time here>  
579       2            2             <time here>   <time here>   
571       2            2             <time here>   <time here>    
588       2            2             <time here>   <time here>  

データが次のようになるように、GroupID 列を追加する必要があります。

Recnum    SectionID    CategoryID    EnterTime     LeaveTime    GroupID
534       2            4             <time here>   <time here>  NULL 
535       2            2             <time here>   <time here>  1
532       2            2             <time here>   <time here>  1
523       2            4             <time here>   <time here>  NULL
512       2            4             <time here>   <time here>  NULL
577       2            NULL          <time here>   <time here>  2
578       1            6             <time here>   <time here>  NULL
579       2            2             <time here>   <time here>  3  
571       2            2             <time here>   <time here>  3
588       2            2             <time here>   <time here>  3

GroupID は、SectionID と CategoryID の両方が 2 の場合、または SectionID が 2 で CategoryID が NULL の場合に使用されます。GroupID は、EnterTime で順序付けされた行にこれらのパターンがいくつかある場合は同じである必要があり、グループの次のセットに対して増分する必要があります。Recnum は PK ですが、EnterTime 順ではありません。これは WHILE ループで実行できますが、テーブルは 3,500 万を超えるレコードであるため、処理に数日かかる可能性があります。これを行う方法について何か考えはありますか?

Example of the times for two rows:
Enter                     Leave
2011-05-31 21:04:07.000   2011-05-31 21:04:35.000
2011-05-31 21:04:35.000   2011-05-31 21:04:44.000
4

2 に答える 2

-1

SQL サーバー内でこれを行うことに制約されていない場合、最善の策は次のとおりです。

  1. データをテキスト ファイルにエクスポートする
  2. そのテキスト ファイルを処理するプログラムを好みの言語で記述します (recnum と新しいグループ ID だけをエクスポートし、グループ ID が null でないもののみをエクスポートすることをお勧めします)。
    • 3,500 万行を超える場合でも、これには数分しかかかりません。
  3. 一括挿入を使用してデータを SQL Server に戻す
    • 繰り返しますが、ほんの数分です
  4. UPDATE ... FROM ステートメントを使用して、一括挿入されたテーブルを元のテーブルに結合し、groupid 列を更新します

    UPDATE o 
    SET GroupID = bi.GroupID
    FROM OriginalTable o 
        INNER JOIN BulkInsertTable bi 
        ON o.RecNum = bi.RecNum
    
    • これにはかなり時間がかかりますが、かかる時間はデータをディスクに書き込む時間であるため、避けられません
于 2012-10-04T15:08:30.027 に答える