Поиск последовательности выбора в столбце

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

Существует таблица, в которой user_id указан для каждого участника теста, а choice — это ответ на все три вопроса. Я хотел бы получить всю различную последовательность вариантов, которые сделал тестируемый, и подсчитать последовательность. Есть ли способ написать sql-запрос для достижения этой цели? Спасибо

 ----------------------------------
| user_id        | Choice        |      
----------------------------------
|     1          |   a           |
----------------------------------
|     1          |   b           |    
----------------------------------
|     1          |   c           |
----------------------------------
|     2          |   b           |
----------------------------------
|     2          |   c           |
----------------------------------    
|     2          |   a           |
----------------------------------
  

Желаемый ответ:

 ----------------------------------    
|     choice          |  count   |
----------------------------------
|      a,b,c          |    1     |
----------------------------------
|      b,c,a          |    1      |
-----------------------------------
  

Комментарии:

1. Пожалуйста, отметьте базу данных, которую вы действительно используете, то есть удалите один из тегов базы данных.

Ответ №1:

В BigQuery можно использовать функции агрегирования:

 select choices, count(*)
from (select string_agg(choice order by ?) as choices, user_id
      from t
      group by user_id
     ) t
group by choices;
  

Для ? столбца, который определяет порядок таблицы. Помните: таблицы представляют собой неупорядоченные наборы, поэтому без такого столбца варианты выбора могут быть в любом порядке.

Вы можете сделать что-то подобное в SQL Server 2017 с помощью string_agg() . В более ранних версиях вам приходилось использовать метод XML, что довольно неприятно.

Комментарии:

1. Спасибо, Гордон. Только что заметил, что группировка по выражению не может быть применена к массиву, но мы можем преобразовать массив в Jason, используя TO_JSON_STRING(выбор)

2. @peteraa . , , я думал, что я агрегировал по массивам. Это, должно быть, было в Postgres.