#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.