【问题标题】:Get MIN MAX grouping by closer distance按更近的距离获取 MIN MAX 分组
【发布时间】:2013-01-03 09:48:51
【问题描述】:

商店

id_shop | id_prod_ty |位置

产品

编号 |价格 | id_prod_ty |距离

table stores 包含 2 个商店,每个 id_prod_ty(产品类型)和一个位置。
表 products 包含许多不同价格和距离的记录

基本上我需要有一个查询,为每种产品以及按更接近的价格分组的每个商店(并且不接近其他商店)选择低价和高价

例如

商店

id_shop | id_prod_ty |位置 1 | 1 | 3 2 | 1 | 7 3 | 2 | 8 4 | 2 | 4 ……

产品

编号 |价格 | 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 ...

谢谢

【问题讨论】:

  • 我不清楚最终结果是如何计算的。您能解释一下“按更接近的价格(并且不靠近其他商店)进行分组”的意思吗?
  • +1 包括样本数据。不过,请添加您的 PostgreSQL 版本。
  • 我们取id_shop 1和2。属于shop 1的更近的价格是:1、2、3、4、5,因为距离shop1比shop2、shop3更近,以此类推。出于同样的原因,价格 6 和 7 属于 shop2。希望这能澄清第 9.2 页
  • @user1944934 。 . . shopsproducts 之间有什么联系?这是您要解决的问题吗?

标签: sql postgresql


【解决方案1】:

我想我理解这个问题。对于每个价格,您都在尝试根据距离和位置分配最近的商店。

方法从加入职位和商店开始。然后它计算位置和距离之间的差异——这似乎是您正在使用的度量。每个价格 ID 将出现两次(每个商店一次)。它使用窗口函数计算每个 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 

【讨论】:

  • 我们几乎完成了 Gordon,我已经修复了查询中的一些错误(ps instad of p)但是我有意外的空值,id_prod_ty | id_price_low | id_price_high | id_shop 1 |空 |空 | 1 1 | 2 | 44 | 2 2 | 9 | 32 | 4 2 |空 |空 | 5个愚蠢的问题,如何获取id而不是价格? (我不能加入,因为许多价值相同的价格)赞赏
  • 当商店距离太远时,您将获得 NULL 值,因此没有最接近它的价格。
  • 我必须研究您的查询才能摆脱那个空白值。谢谢
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 2017-08-07
  • 2021-01-15
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多