1

これらの例の行を含むテーブルがあります。

クーポンID ShopID ShopLongitude ShopLatitude
365 1881 55,5574105 9,9613295
365 23550 55,5510846 9,9936818
365 33550 55,6220936 10,0663895
365 33551 55,5573436 9,9611765
366 1881 55,5574105 9,9613295
366 23550 55,5510846 9,9936818
367 1881 55,5574105 9,9613295
533 1881 55,5574105 9,9613295
533 23550 55,5510846 9,9936818
533 33550 55,6220936 10,0663895
533 33551 55,5573436 9,9611765
354 1881 55,5574105 9,9613295
354 23550 55.5510846 9,9936818
354 33550 55,6220936 10,0663895
354 33551 55,5573436 9,9611765

結果として、すべての CouponID に最も近い ShopID を取得したい

私はすでにクエリを持っています:

SELECT CouponID, MIN (dbo.DistanceBetween (53.54613,9.98537,ShopLatitude,ShopLongitude)) as distance
FROM Table
GROUP BY CouponID
ORDER BY CouponID, distance ASC 

各クーポンの CouponID と ShopID までの最小距離を出力します。

クーポン ID の距離
354 0,778524633472375
365 0,778524633472375
366 0,778524633472375
367 2,02548179145764

LINQ では、ステートメントは次のようになります。

var coupon = (from c in dbContext.table
                      group c by c.CouponID into cgrp
                      select new
                      {
                        CouponID = cgrp.Key,
                        Distance = cgrp.Min(c => DistanceBetween(latitude, longitude, c.ShopLatitude, c.ShopLongitude))
                      })
                      .OrderBy(c => c.CouponID).ThenBy(c => DistanceBetween(latitude, longitude, c.ShopLatitude, c.ShopLongitude));

クエリと Linq ステートメントから最短距離で関連する ShopID を取得するにはどうすればよいですか?

4

2 に答える 2

1
SELECT c.CouponID, c.ShopID, nearest.distance
FROM
Coupons C JOIN
(
    SELECT CouponID, MIN (dbo.DistanceBetween (53.54613,9.98537,ShopLat,ShopLon)) as distance
    FROM Coupons
    GROUP BY CouponID   
) nearest on c.CouponID = nearest.CouponID
          AND dbo.DistanceBetween (53.54613,9.98537,ShopLat,ShopLon) = nearest.distance
ORDER BY CouponID, distance ASC 
于 2013-03-27T17:34:41.900 に答える
0

必要なグループ化と結合を実行するように SQL クエリを変更するだけです。

距離を保持するテーブルを作成し、クーポン ID とショップ ID が一致する分を選択します。

于 2013-03-27T16:58:00.377 に答える