У меня возникают некоторые проблемы со следующим кодом. Я работаю над проблемой верхней корзины, где я пытаюсь подсчитать количество комбинаций корзин, где каждая транзакция должна содержать только 4 элемента. Следующий код работает хорошо, но когда транзакция покупает дополнительные 4 элемента (или более), она не будет учитываться в шаге комбинированной_батки.
With RowNums as (
select
edw_transaction_id, row_number() over (partition by edw_transaction_id order by article_name) as row_id, article_name
from thing1
),
BasketItems as (
select a.edw_transaction_id, a.article_name as _1, b.article_name as_2,c.article_name as _3,d.article_name as _4
from (select edw_transaction_id,article_name from RowNums where row_id =1) a
join (select edw_transaction_id,article_name from RowNums where row_id =2) b
on a.edw_transaction_id = b.edw_transaction_id
join (select edw_transaction_id,article_name from RowNums where row_id =3) c
on a.edw_transaction_id = c.edw_transaction_id
join (select edw_transaction_id,article_name from RowNums where row_id =4) d
on a.edw_transaction_id = d.edw_transaction_id
),
combined_basket as (
select count(*) as basket_count, _1 as basket_item1,_2 as basket_item2,_3 as basket_item3,_4 as basket_item4
from BasketItems
group by 2,3,4,5
order by 1 desc
)
select *
from combined_basket
order by 1 desc
limit 10
Результат для BasketItems выглядит примерно так:
Trans Id Row_num Article_Name
6368773827 1 Apples
6368773827 2 Oranges
6368773827 3 Cheese
6368773827 4 Egg
6368774403 1 Apple
6368774403 2 Egg
6368774403 3 Cake
6368774403 4 Salad
6368774403 5 Egg
6368774403 6 Apple
6368774403 7 Lemon
6368774403 8 Burger
Как вы можете сказать из приведенного выше кода, он будет считать только первые 4 пункта и оставить остальные (для каждой транзакции). Есть ли способ повторить функцию row_number, когда она превышает 4, или существует другой способ решения этой проблемы, поэтому каждая транзакция из 4 считается?
Желаемый результат будет для транзакции. Каждый элемент будет отмечен с 1 по 4.
Вы можете добавить математическую функцию, то есть Row_number% 4. Это решит проблему даже без раздела:
row_number() over (order by article_name)% 4 as row_id
Хотя, я не уверен на 100%, если% в качестве знака существует в MySQL. Если это не так, найдите модульное деление.