Данные моей транзакции имеют много столбцов, но обычно имеют следующую структуру:
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 минут, поэтому не уверен, что он вернет. Первый запрос выполняется, но занимает некоторое время, хотя результаты выглядят относительно ожидаемыми.
Любая помощь приветствуется, я уверен, что есть лучший способ, чем этот!