Как я могу запросить случайное количество значений для уникального идентификатора и объединить их в одно?

#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, так что да, у нас есть временные метки для каждого попадания).