Как я могу получить количество перекрывающихся значений и сортировать по процентам большинства перекрывающихся - PullRequest
3 голосов
/ 12 марта 2020

Пример:

--------------------------
| product      | store   |
--------------------------
| abc1         | 2       |
| abc2         | 2       |
| abc1         | 3       |
| abc1         | 5       |
| abc1         | 4       |
| abc2         | 3       |
| abc3         | 3       |
| abc1         | 1       |
| abc4         | 3       |
| abc5         | 3       |
--------------------------

Я пытаюсь получить процент общих продуктов между различными магазинами и отсортировать их по магазинам с наибольшим перекрытием.

Я не совсем уверен, как решить эту проблему.

Fiddle: https://www.db-fiddle.com/f/bm5c7k7q5qbQY3Qu8t5Gvx/1

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я думаю, что вы ищете декартово объединение между магазинами, а затем проверяете, чтобы увидеть количество совпадений sku.

Вот мой запрос

--This gets the total count of sku by store
    with data
      as (select store_id,count(sku) as tot_sku
           from products
           group by store_id
          )
    select a.store_id as store_id
          ,b.store_id as other_store_id
          --when the skus in one store match with another then count those
          ,count(case when a.sku=b.sku then 1 end) as cnt_overlap 
          ,max(c.tot_sku) as tot_sku
          ,count(case when a.sku=b.sku then 1 end)*100.00/max(c.tot_sku) as pct_overlap
     from products a
     join products b
       on a.store_id <> b.store_id
     join data c
       on a.store_id=c.store_id
    group by a.store_id,b.store_id
    order by 1

+----------+----------------+-------------+---------+----------------------+
| store_id | other_store_id | cnt_overlap | tot_sku |     pct_overlap      |
+----------+----------------+-------------+---------+----------------------+
|        1 |              2 |           1 |       1 | 100.0000000000000000 |
|        1 |              3 |           1 |       1 | 100.0000000000000000 |
|        1 |              4 |           1 |       1 | 100.0000000000000000 |
|        1 |              5 |           1 |       1 | 100.0000000000000000 |
|        2 |              1 |           1 |       2 |  50.0000000000000000 |
|        2 |              3 |           2 |       2 | 100.0000000000000000 |
|        2 |              4 |           1 |       2 |  50.0000000000000000 |
|        2 |              5 |           1 |       2 |  50.0000000000000000 |
|        3 |              1 |           1 |       5 |  20.0000000000000000 |
|        3 |              2 |           2 |       5 |  40.0000000000000000 |
|        3 |              4 |           1 |       5 |  20.0000000000000000 |
|        3 |              5 |           1 |       5 |  20.0000000000000000 |
|        4 |              1 |           1 |       1 | 100.0000000000000000 |
|        4 |              2 |           1 |       1 | 100.0000000000000000 |
|        4 |              3 |           1 |       1 | 100.0000000000000000 |
|        4 |              5 |           1 |       1 | 100.0000000000000000 |
|        5 |              1 |           1 |       1 | 100.0000000000000000 |
|        5 |              2 |           1 |       1 | 100.0000000000000000 |
|        5 |              3 |           1 |       1 | 100.0000000000000000 |
|        5 |              4 |           1 |       1 | 100.0000000000000000 |
+----------+----------------+-------------+---------+----------------------+

вот моя ссылка на БД скрипта

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=151fa1f18ac25bb0362ebc47de02dd09

1 голос
/ 12 марта 2020

Вы можете использовать самостоятельное соединение. Следующее предполагает, что вы хотите пропорции, основанные на продуктах в first store:

select t1.store_id, t2.store_id, t1.num_products,
       count(*) * 1.0 / t1.num_products as ratio
from (select p.*, count(*) over (partition by store_id) as num_products
      from products p
     ) t1 join
     products t2
     on t1.sku = t2.sku
group by t1.store_id, t2.store_id, t1.num_products
order by ratio desc;

Это не симметрия c.

Здесь - это дб <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...