#mysql #sql #google-bigquery #bq
#mysql #sql #google-bigquery #bq
Вопрос:
У меня есть таблица с 2 столбцами, 1-й — это, скажем, имя клиента, а второй — его выбор. Обратите внимание, что он может выбрать несколько вариантов (1 или более)! и может также выполнять 2-й порядок!
Ввод выглядит следующим образом, например:
| Client | Order item |
| -------- | ---------------- |
| User 1 | 1-cola |
| User 1 | 2-fries |
| User 1 | 3-burger |
| User 2 | 1-cola |
| User 2 | 2-fries |
| User 3 | 2-fries |
| User 3 | 1-cola |
| User 4 | 3-burger |
| User 5 | 1-cola |
| User 5 | 2-fries |
| User 5 | 3-burger |
| User 5 | 3-burger |
| User 5 | 1-cola |
И чего я пытаюсь добиться, так это получить одну строку для каждого заказа следующим образом:
Клиент | Элемент заказа |
---|---|
Пользователь 1 | 1-кола — 2-картофель фри — 3-бургер |
Пользователь 2 | 1-кола — 2-картофель фри |
Пользователь 3 | 1-кола — 2-картофель фри |
Пользователь 4 | 3-бургер |
Пользователь 5 | 1-кола — 2-картофель фри — 3-бургер |
Пользователь 5 | 1-кола — 3-бургер |
Внимание! 1- Для клиента 3 элементы упорядочиваются при объединении! 2- Для клиента 5 у нас есть 2 заказа, обнаруженных просто по наличию дубликата элемента для этого заказа, чтобы он был помещен в новую строку!
Я знаю, что это немного сложно, но мне действительно интересно, возможно ли это сделать! Надеюсь, я хорошо это описал!
BR, Наз
Комментарии:
1. строки sql не упорядочены по отношению к другим строкам. Между ними нет разницы
1-cola
дляUser 5
. СоздайтеorderId
столбец в своей таблице.2. Каков ваш первичный ключ?
3. @raymondnijland в таком случае посмотрите еще раз
4. Как вы определяете «второй порядок»?
Ответ №1:
Ниже приведен стандартный SQL BigQuery
select client,
string_agg(order_item, ' - ' order by order_item) as order_items
from (
select *,
row_number() over(partition by client, order_item) as client_order
from `project.dataset.table`
)
group by client, client_order
# order by client, client_order
если применяется к образцу данных в вашем вопросе — вывод
Примечание: логика, которую вы описали в вопросе, немного нечеткая, поэтому идентификация новых заказов и «распространение» элементов по нескольким заказам одного и того же клиента могут отличаться от того, что было в действительности. Чтобы «исправить» это — вам нужно добавить больше «игроков» в свою логику — возможно, временную метку и / или явную строку, указывающую новый порядок
Комментарии:
1. Спасибо, Михаил, очень признателен за помощь, я протестирую дальше и вернусь! .. Да, на самом деле это сложнее, чем это, но я попытался упростить и получить представление о том, как достичь этой части, но не уверен, что лучше задать полный вопрос в новом или здесь? (кстати. данные поступают из GA, так что да, у нас есть временные метки для каждого попадания).