Функция 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
Другие вопросы по тегам