Данные транзакции SQL: из данных на уровне строки корзины определите количество корзин, в которых продукт отображается как единственный продукт в корзине. - PullRequest
0 голосов
/ 10 апреля 2019

Данные моей транзакции имеют много столбцов, но обычно имеют следующую структуру:

Basket_ID Product_ID  
basket1 product1  
basket1 product2  
basket1 product3  

basket2 product1  
basket2 product1

Каждая корзина имеет много строк, а basket_ID выступает в качестве ключа. Каждый экземпляр товара имеет свою собственную линию в корзине, поэтому два одинаковых элемента будут по-прежнему находиться над двумя строками. Данные корзины также содержат типы платежей, детали продвижения и т. Д., Но это устраняется фильтрацией sales_quantity = 1.

По идентификатору продукта я хотел бы перейти к общему количеству корзин, в которых товар является единственным товаром в корзине, а также указать процентное соотношение покупок этого товара в качестве единственного предмета в корзине. , То есть product1 продается 100 раз во всех корзинах, это был единственный товар в 5 корзинах, следовательно, 5%.

У меня есть код, который, кажется, правильно возвращает счет, но я борюсь с% part. Это также довольно неоптимально, так что я уверен, что должен быть более эффективный способ.

Кажется, что это работает (но очень грязно), чтобы вернуть количество корзин, сгруппированных по product_id, где продукт является единственным элементом в корзине:

drop table if exists #tempbasket

   --unique products basket size distribution
  select report_transaction_ID
  ,count(product_id) as uniq_prods
  into 
#tempbasket
  from 
    (
  select
  report_transaction_ID
  ,product_id
  FROM Transactions
  WHERE CONVERT(DATE, TRANSACTION_DATE) BETWEEN '2019-02-04' and '2019-04-04' 
  AND basket_id is not null 
  and PRODUCT_ID is not null
  AND sales_quantity = 1) q1
  group by REPORT_TRANSACTION_ID
  having count(PRODUCT_ID) = 1

  select
  product_id
  ,count(q1.report_transaction_ID) as num_single_item_baskets
  FROM 
  (
  select
  report_transaction_ID
  ,product_id
  FROM Transactions
  WHERE CONVERT(DATE, TRANSACTION_DATE) BETWEEN '2019-02-04' and '2019-04-04' 
  AND basket_id is not null 
  and PRODUCT_ID is not null
  AND sales_quantity = 1) q1
    inner join #tempbasket t2 on q1.REPORT_TRANSACTION_ID = t2.REPORT_TRANSACTION_ID 
    where uniq_prods = 1
  group by product_id
  order by count(q1.report_transaction_ID) desc

Тогда моя еще более грязная попытка решить% ...:

 select
  q1.product_id
  ,count(q1.report_transaction_ID) as num_single_item_baskets
  ,count(q2.report_transaction_ID) as total_baskets
  ,(count(q1.report_transaction_ID)*1.00)/(count(q2.report_transaction_ID)*1.00) as pct_single_item_baskets
  FROM 
  (
  select
  report_transaction_ID
  ,product_id
  FROM Transactions
  WHERE CONVERT(DATE, TRANSACTION_DATE) BETWEEN '2019-02-04' and '2019-02-04' 
  AND basket_id is not null 
  and PRODUCT_ID is not null
  AND sales_quantity = 1) q1
    inner join #tempbasket t2 on q1.REPORT_TRANSACTION_ID = t2.REPORT_TRANSACTION_ID 
    inner join
    (
  select
  report_transaction_ID
  ,product_id
  FROM Transactions
  WHERE CONVERT(DATE, TRANSACTION_DATE) BETWEEN '2019-02-04' and '2019-02-04' 
  AND basket_id is not null 
  and PRODUCT_ID is not null
  AND sales_quantity = 1) q2 on q1.PRODUCT_ID = q2.product_id
  group by q1.product_id
  order by count(q1.report_transaction_ID) desc

По-прежнему выполняется второй запрос через 30 минут, поэтому не уверен, что он вернет. Первый запрос выполняется, но занимает некоторое время, хотя результаты выглядят относительно ожидаемыми.

Любая помощь приветствуется, я уверен, что есть лучший способ, чем этот!

1 Ответ

0 голосов
/ 10 апреля 2019

Хммм. , , Вы можете использовать два уровня агрегации, чтобы ответить на ваш главный вопрос:

select count(*)
from (select Basket_ID 
      from transactions
      group by Bascket_ID
      having min(Product_ID) = max(Product_ID)
     ) b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...