我在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个不同的商店中进行抽样。
答案 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个条目。最终计数。