SQL Row_number () Repeat

0

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

  • 0
    Что произойдет, если у вас будет 3 товара в заказе? Стоит ли продолжать с 4 или начать с 1 следующей транзакции?
  • 1
    Если у вас не MySQL 8+, это не код MySQL.
Показать ещё 1 комментарий
Теги:
impala
relational-database

1 ответ

0
Лучший ответ

Вы можете добавить математическую функцию, то есть Row_number% 4. Это решит проблему даже без раздела:

row_number() over (order by article_name)% 4 as row_id

Хотя, я не уверен на 100%, если% в качестве знака существует в MySQL. Если это не так, найдите модульное деление.

  • 1
    Благодарю. Я пошел с чем-то вроде этого в: выберите edw_transaction_id, (row_number () over (разделение по порядку edw_transaction_id по article_name)% 4) +1 как row_id, article_name
  • 0
    Ага, забыл про +1 лол

Ещё вопросы

Сообщество Overcoder
Наверх
Меню