0

問題が発生したため、SQLを初めて使用するため、mssqlにテーブルがあります。テーブルは次のデータで構成されます。

    ID     |     Long     |     Lat      |     TimeStamp
-----------+--------------+--------------+------------------    
    123    |      54      |     18       |    2012-12-02...       
    143    |      31      |     35       |    2011-09-14...
    322    |      53      |     19       |    2012-11-29...

等々...

long と lats のペアの条件をチェックするブール関数を作成しました。また、経度と緯度のペア間の距離を与える関数も作成しました。私がしたいのは、現在の行に最も近く、ブール関数を渡し、時間的に十分に近い行までの距離を持つ列を追加することです。データベース テーブルは数百万行で構成されているため、ネストされた for ループの使用は控えます。この大規模なデータセットにどのように取り組みますか? mssql にはこれを行うスマートな方法がありますか?

すべてのヘルプを歓迎します <3

4

1 に答える 1

0

基本的に、関数内で 100 万個のレコードを 100 万個の他のレコードと比較する必要があり、1 兆個の値を使用できます。私の意見では、SQL はそれほど多くのレコードを管理するのに実際には役立たないので、自分でいくつかの作業を行う必要があり、一度に少しの作業だけを行う必要があります。もっと良い方法があるかもしれませんが、私は次のようにします。

  1. 次の列をテーブルに追加します: calculated destinationdistance
  2. アルゴリズムを定期的に実行するか、新しいレコードが追加された場合に実行します。このアルゴリズムは、calculatedが false のレコードに対してのみ実行する必要があります。

アルゴリズムは以下のように機能します。

  1. calculated現在のレコードを使用して、asを持つ各レコードをループし、trueその場所までの距離を計算します。場所がこれまでで最も短い場合は、変数を設定して と を一時的に格納しdestinationますdistance
  2. ループが終了するdestinationdistance、現在の場所が最短になります。データベースでそれを更新し、calculatedフラグを に設定しtrueます。
  3. 次に、この距離を目的地のレコードの距離と比較します。短い場合は、そのレコードも更新します。
于 2013-02-14T08:10:08.843 に答える