Функция group_concat удаляет дубликаты
Создан следующий запрос в BigQuery:
SELECT
date,
userId,
SUM(totals.visits) totalvisits,
GROUP_CONCAT(device.deviceCategory) sequentialdevice
FROM (
SELECT
date,
visitStartTime,
customDimensions.value userId,
totals.visits,
device.deviceCategory
FROM
TABLE_DATE_RANGE([164345793.ga_sessions_], TIMESTAMP('20171127'), CURRENT_TIMESTAMP())
WHERE
customDimensions.index = 1
AND customDimensions.value CONTAINS "hip|"
GROUP BY
date,
visitStartTime,
userId,
totals.visits,
device.deviceCategory
HAVING
userId="hip|7e4fbce9-bbfb-4677-aab0-dcd02851fdb4"
ORDER BY
date ASC,
visitStartTime ASC)
GROUP BY
date,
userId
В качестве временной меры я использую предложение с целью проверить его (это будет удалено в рабочей среде). Запрос выводит следующее:
Это все замечательно и работает, как и ожидалось, выводя устройства в соответствующем порядке (планшет, планшет, планшет, мобильный телефон, настольный компьютер) - однако я хочу удалить из этого дубликаты, чтобы результаты были "планшет, мобильный телефон, рабочий стол"
Я попытался использовать функцию Unique(), она удаляет дубликаты, однако порядок не сохраняется, поэтому вывод становится "рабочий стол, мобильный телефон, планшет"
Любая помощь будет оценена!
Обновить
Я обновил запрос до стандартного SQL, и теперь я столкнулся с другой проблемой, используя функцию string_agg():
SELECT
date,
userId,
totalsvisits,
STRING_AGG(DISTINCT devicecategory ORDER BY date ASC, vstime ASC) deviceAgg
FROM (
SELECT
date,
visitStartTime vstime,
cd.value userId,
totals.visits totalsvisits,
device.deviceCategory devicecategory
FROM
`12314124123123.ga_sessions_*`,
UNNEST(customDimensions) AS cd
WHERE
cd.index=1
AND cd.value IS NOT NULL
GROUP BY
date,
visitStartTime,
userId,
totals.visits,
device.deviceCategory
HAVING
userId="hip|7e4fbce9-bbfb-4677-aab0-dcd02851fdb4"
ORDER BY
date ASC,
visitStartTime ASC)
GROUP BY
date,
userId,
totalsvisits
Возвращенная ошибка: "Агрегатная функция, имеющая аргументы DISTINCT и ORDER BY, может только столбцы ORDER BY, являющиеся аргументами функции"
Очевидно, что если мы уберем из оператора string_agg отдельный или упорядоченный по выражению, это работает, но нам нужны обе операции.
2 ответа
Для обновленного вопроса следующий запрос выдает ту же ошибку:
SELECT age_midpoint, STRING_AGG(DISTINCT country ORDER BY c DESC)
FROM (
SELECT country, age_midpoint, COUNT(*) c
FROM `fh-bigquery.stackru.survey_results_2016`
WHERE age_midpoint IS NOT null
AND country LIKE '%u%'
GROUP BY 1, 2
)
GROUP BY 1
ORDER BY 1
Ограничение имеет смысл, потому что, как только вы запустите DISTINCT
, вы теряете видимость в переменной, которую вы хотели предоставить заказ.
Попробуйте это вместо этого:
#standardSQL
SELECT age_midpoint, ARRAY_TO_STRING(ARRAY(
SELECT country FROM (SELECT country, c FROM UNNEST(arr) GROUP BY country, c) ORDER BY c DESC
), ',')
FROM (
SELECT age_midpoint, ARRAY_AGG(STRUCT(country, c)) arr
FROM (
SELECT country, age_midpoint, COUNT(*) c
FROM `fh-bigquery.stackru.survey_results_2016`
WHERE age_midpoint IS NOT null
AND country LIKE '%u%'
GROUP BY 1, 2
)
GROUP BY 1
)
ORDER BY 1
LIMIT 1000
(См. https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays)
Благодаря Фелипе на этом, вот завершенный запрос!
SELECT
date, value, SUM(visits) visits, STRING_AGG(DISTINCT seqdevice) seqdevice, COUNT(DISTINCT seqdevice) countseqdevice
FROM (
SELECT date, value, visits, ARRAY_TO_STRING(ARRAY(
SELECT deviceCategory FROM (SELECT deviceCategory, c FROM UNNEST(arr) GROUP BY deviceCategory, c) ORDER BY c DESC
), ',') seqdevice
FROM (
SELECT date, visitStartTime, value, visits, ARRAY_AGG(STRUCT(deviceCategory, c)) arr
FROM (
SELECT date, visitStartTime, cd.value value, totals.visits visits, device.deviceCategory deviceCategory, COUNT(*) c
FROM `xxxxxxxxxx`, UNNEST(customDimensions) AS cd
WHERE cd.index=1 AND STARTS_WITH(cd.value,"hip|")
GROUP BY 1, 2, 3, 4, 5
)
GROUP BY 1, 2, 3, 4
)
ORDER BY 2)
GROUP BY 1, 2
HAVING
value="hip|7e4fbce9-bbfb-4677-aab0-dcd02851fdb4"
ORDER BY countseqdevice desc