выбрать набор товаров, присутствующих во всех магазинах все недели - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть база данных в postgresql с product_id, store_id, week, price_avg, price_min, price_max, и я хочу выбрать набор однородных продуктов, который присутствует в ряде магазинов и в те же недели.

Я пробовал некоторые подходы, ноэто трудно, так как у меня 22 миллиона цен, 2645 различных магазинов и данных за 13 недель.

Цель - выбрать набор из 20 product_ids, которые присутствуют во всех 13 неделяхинформации и того, что они появляются в наборе из 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 голосов
/ 26 сентября 2018

У меня есть база данных в postgresql с product_id, store_id, week, price_avg, price_min, price_max … Цель состоит в том, чтобы выбрать набор из 20 product_ids, которые присутствуют во всех 13 неделях информациии что они появляются в наборе из 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

Вы можете отклонить строку AND , если уверены, что в вашей таблице нет ничего, кроме 13 указанных недель.Укажите запрошенное хранилище, идентифицирующее верхнее, и замените yourtable на фактическое имя.

Дело в том, что предварительный выбор DISTINCT в первую очередь только с соответствующими полями избавит от каждого дублированногоЕсли у вас есть несколько данных о цене для данной комбинации цена-магазин-неделя.

Учитывая это, продукт, который появляется все эти 13 недель во всех 10 разных магазинах, должен производить ровно 130 записей.Таким образом, окончательный счет.

...