私は問題を理解していると思います。価格ごとに、距離と位置に基づいて最寄りのショップを割り当てようとしています。
アプローチはポジションとショップを結合することから始まります。次に、位置と距離の差を計算します。これは、使用している尺度のようです。各価格 ID は 2 回 (ショップごとに 1 回) 表示されます。ウィンドウ関数を使用して、各 ID の最小差を計算します。
この情報を使用して、クエリはどちらが最寄りの店舗であるかを判断できます。このバージョンは、最低価格の ID ではなく、価格を返します。テストされていない最終的なクエリは次のとおりです。
select id_prod_ty,
MIN(case when diff = minDiff then price) as price_low,
MAX(case when diff = minDiff then price) as price_high,
s.id_shop
from (select p.id_prod_ty,
s.id_shop,
p.price,
(p.distance - s.position) as diff,
MIN(p.distance - s.position) over (partition by p.id) as minDiff
from products p join
shops s
on p.id_prod_ty = s.id_prod_ty
) ps
group by id_prod_ty, id_shop
これもIDを取得するバリエーションです。ウィンドウ関数を使用して最小価格と最大価格を見つけ、価格をこれらの値と比較して ID を取得します。
select id_prod_ty,
MIN(minPrice) as price_low,
MIN(case when price = minPrice then id end) id_price_low,
MAX(maxprice) as price_high,
MIN(case when price = maxPrice then id end) id_price_high,
id_shop
from (select *,
MIN(IsThisShopPrice) over (partition by id_prod_ty, id_shop) as minPrice,
MIN(IsThisShopPrice) over (partition by id_prod_ty, id_shop) as maxPrice,
from (select p.id_prod_ty, s.id_shop, p.price, p.id,
(p.distance - s.position) as diff,
(case when (p.distance - s.position) = MIN(p.distance - s.position) over (partition by p.id)
then 'Y'
else 'N'
end) as IsThisShop
(case when (p.distance - s.position) = MIN(p.distance - s.position) over (partition by p.id)
then price
end) as IsThisShopPrice
from products p join
shops s
on p.id_prod_ty = s.id_prod_ty
) ps
) ps
group by id_prod_ty, id_shop