2

お店

id_shop | id_prod_ty | ポジション

製品

id | 価格| id_prod_ty | 距離

テーブルショップには、id_prod_ty(製品タイプ)とポジションごとに2つのショップが含まれています。
テーブル製品には、価格と距離が異なる多くのレコードが含まれています

基本的に、私は各製品と各ショップの価格をより近い価格でグループ化して(そして他のショップに近くない)価格を選択するクエリを持っている必要があります

たとえば

お店

id_shop | id_prod_ty | ポジション
  1 | 1 | 3
  2 | 1 | 7
  3 | 2 | 8
  4 | 2 | 4
...。

製品

id | 価格| id_prod_ty | 距離
1 | 10 | 1 | 1        
2 | 04 | 1 | 2
3 | 02 | 1 | 4
4 | 44 | 1 | 2
5 | 09 | 1 | 1
6 | 13 | 1 | 7
7 | 15 | 1 | 8
8 | 09 | 2 | 5
9 | 12 | 2 | 8
10 | 17 | 2 | 1
11 | 32 | 2 | 13
12 | 22 | 2 | 2
..。

結果はこのように叫ぶ

id_prod_ty | id_price_low | id_price_high | id_shop
1 | 3(02)| 4(44)| 1
1 | 6(13)| 7(15)| 2
2 | 8(09)| 12(22)| 4
2 | 9(12)| 11(32)| 3
..。

ありがとう

4

1 に答える 1

0

私は問題を理解していると思います。価格ごとに、距離と位置に基づいて最寄りのショップを割り当てようとしています。

アプローチはポジションとショップを結合することから始まります。次に、位置と距離の差を計算します。これは、使用している尺度のようです。各価格 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 
于 2013-01-03T14:56:37.833 に答える