0

以下のロジックを SQL ステートメントで実装することは可能ですか? 実装された場合、30 分の時間枠で 4000 件の注文を処理する際にパフォーマンスの潜在的なリスクはありますか? データベースとしてSQL Serverがあります。

以下のように2つのテーブルがあります。

注文

Cust_ID Cust_WHID Emp_ID 緯度 経度
C10001 WH142001 ?????? 13.051738 77.629877
C10002 WH142001 ?????? 13.047688 77.629279
C10003 WH142001 ?????? 13.043722 77.623373
C10004 WH142002 ?????? 13.047213 77.628853

User_Validation
User_ID User_WHID Latitude Longitude Current_Capacity
EMP100001 WH100001 13.033304 77.636592 5 EMP100002 WH100001 13.032645 77.629908 3 EMP100003 WH100001 13.046191 77.625797 0 EMP100004 WH100002 13.044981 77.626154 2 EMP100005 WH100002 13.052305 77.631151 4 EMP100006 WH100002 13.051004 77.630786 0

ここで、注文テーブルの Emp_ID フィールドを以下の基準で更新したいと考えています。

  1. User_Validation テーブルから倉庫ごとの従業員数を見つけます。
  2. User_Validation テーブルの従業員の緯度と経度を Order テーブルの顧客の緯度と経度と比較して、顧客に最も近い従業員を見つけます。
  3. 最も近い従業員の Current_Capacity は 6 を超えてはなりません。
  4. すでに 6 になっている場合は、従業員が見つかるまで、最大容量のない次の近くの従業員を見つけます。
  5. すべての従業員の定員が 6 の場合、最も近い従業員 ID を顧客に割り当てます。

複数のレコードがある場合は機能しないことがわかっている以下のロジックを試しました。単一のレコードでも試しましたが、ステートメントでエラーが発生しました。

Update Orders Set Emp_ID=User_Validation.User_ID from (Select User_ID from 
User_Validation where Current_Capacity <='6' and (SELECT Top 1 User_ID, (( 6367450 * 
acos(   cos( radians(Orders.Latitude) ) * cos( radians( User_Validation.Latitude ) ) * 
cos(   radians( User_Validation.Longitude ) - radians(Orders.Longitude) ) + sin(   
radians(Orders.Latitude) ) * sin( radians( User_Validation.Latitude ) ) ) )) AS   
distance_Mtrs FROM Orders, User_Validation order by distance_Mtrs)) where   
Orders.Cust_WHID=User_Validation.User_WHID
4

1 に答える 1

0

おそらく、次のクエリがあなたを導くかもしれません

with cte as (
SELECT 
    Cust_ID, Cust_WHID,
    User_ID, User_WHID, Current_Capacity,
    case when Current_Capacity >= 6 then 1 else 0 end as isfull,
    dbo.fnGetDistance(o.Latitude, o.Longitude, e.Latitude, e.Longitude, 'Meters') distance
FROM Orders o, User_Validation e
--  ORDER BY Current_Capacity
), cte2 as (
select *, row_number() over (order by distance, isfull, Current_Capacity) rn
from cte
--  ORDER BY distance, isfull, Current_Capacity
)
select * from cte2
where rn = 1
--ORDER BY distance, isfull, Current_Capacity

距離の計算には、Jim Jackson が作成したユーザー関数を使用しました ( http://weblogs.asp.net/jimjackson/archive/2009/02/13/calculating-distances-between-latitude-and-longitude-t-を参照してください)。 sql-haversine.aspx )

于 2013-09-24T06:20:52.143 に答える