选择所有星期在所有商店都有的一组产品

时间:2018-09-26 16:38:57

标签: sql postgresql relational-division

我在Postgresql中有一个带有product_id, store_id, week, price_avg, price_min, price_max的数据库,我想选择一组在同一周的商店中都存在的同类产品。

我尝试了一些方法,但是这很困难,因为我拥有2200万的价格,2645个不同的商店和13周的数据。

目标是选择在所有13周的信息中均存在的20个product_id集合,并始终在10个商店的集合中出现。

首先,我考虑将数据库拆分为每个商店的表,然后使用product_id进行内部联接。但这对于SQL来说代价很高。

第二,我在桌子上呆了前两个星期。然后我运行

select 
    count() as quantity, f2.product, f2.key_all_stores 
from 
    database f2 
group by 
    product_id, key_all_stores 
having 
    count() = 2 

计数为2的两个星期都保留这些产品。然后选择这些产品,然后运行以下命令:

select 
    count(), product_id 
from 
    (select 
         count() as quantity, f2.product_id, f2.clave_todo_junto 
     from 
         fer f2 
     group by 
         producto, key_all_stores 
     having 
         count() = 2) as subquery 
group by 
    subquery.product_id 
having 
    count() = 4 

这两个查询的问题在于,我要花两个星期的时间,并在4个不同的商店中进行抽样。

1 个答案:

答案 0 :(得分:0)

  

我在Postgresql中有一个数据库,其中包含 product_id,store_id,week,price_avg,price_min,price_max …   目标是选择在所有13周的信息中都存在的20个product_id,并始终在10个商店中显示它们。

如果如上所述,所有这些列都仍在单个表中,则可以尝试以下快捷方式:

WITH shortlist(product_id,store_id,week) AS
(
    SELECT DISTINCT product_id,store_id,week
               FROM yourtable
              WHERE store_id IN (store1,store2,store3,store4)
                AND week     IN (week1,week2,week3,…)
)

  SELECT product_id,count(*)
    FROM shortlist
GROUP BY product_id
  HAVING count(*) >= 130

如果您确定自己的表中除了引用的13周外没有其他内容,则可以关闭 AND 行。将请求的商店ID指定为上方的商店ID,然后用实际名称替换 yourtable

这里的要点是,如果您有多个关于给定价格-存储-周组合的价格数据,则首先仅使用相关字段进行DISTINCT预选择将消除每个重复的行。

鉴于此,在这10个不同的商店中的所有这13个星期中都出现过的产品,应准确产生130个条目。最终计数。