Стандарт SQL - Как посчитать частоту значений в массиве - PullRequest
0 голосов
/ 23 января 2020

Я получаю следующую таблицу с запросом внизу:

result of SQL query - screenshot

SELECT 
  fullVisitorId,
  COUNT(fullVisitorId) as id_count,
  ARRAY_AGG(trafficSource.medium) AS trafic_medium
FROM 
  `bigquery-public-data.google_analytics_sample.ga_sessions_20170101`
GROUP BY
  fullVisitorId
ORDER BY
  id_count DESC

Для каждого из значений в столбце trafic_medium (например, cp c, referral, organi c, et c.) Я пытаюсь выяснить, как часто каждое значение встречается в массиве, поэтому желательно добавить новый столбец 'count', показывающий, как часто это значение встречалось?

+-----------+---------+------+
| array_agg | medium  | count|
+-----------+---------+------+
| 123       | cpc     |   2  |
+-----------+---------+------+
|           | organic |   1  |
+-----------+---------+------+
|           | cpc     |   2  |
+-----------+---------+------+
| 456       | organic |   2  |
+-----------+---------+------+
|           | organic |   2  |
+-----------+---------+------+
|           | cpc     |   1  |
+-----------+---------+------+

Я новичок в SQL, поэтому я довольно застрял.

Я пробовал это до сих пор:

WITH medium AS
(
    SELECT 
        fullVisitorId,
        COUNT(fullVisitorId) as id_count,
        ARRAY_AGG(trafficSource.medium) AS trafic_medium
    FROM 
        `bigquery-public-data.google_analytics_sample.ga_sessions_20170101`
    GROUP BY
        fullVisitorId
    ORDER BY
        id_count DESC
) 
SELECT
    fullVisitorId,
    trafic_medium,
    (SELECT AS STRUCT Any_Value(trafic_medium) AS name, COUNT(*) AS count
FROM 
    UNNEST(trafic_medium) AS trafic_medium) AS trafic_medium_2,
FROM 
    medium

Основано на этой теме: Как частота счета элементов в поле массива больших запросов

Однако это показывает только число 'Any_Value, не для всех различных.

Я был бы признателен за некоторую помощь!

PS Я делаю это в BigQuery на 'bigquery-publi c -dataset.google_analytics_sample'

1 Ответ

0 голосов
/ 23 января 2020

Ниже для BigQuery Standard SQL, чтобы помочь вам начать

#standardSQL
SELECT id, trafic_medium,
  ARRAY(
    SELECT AS STRUCT medium, COUNT(1) `count`
    FROM t.trafic_medium medium
    GROUP BY medium
  ) stats
FROM `project.dataset.table` t

, если применить к образцу / фиктивные данные из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 123 id, ['cpc', 'organic', 'cpc'] trafic_medium UNION ALL
  SELECT 456, ['organic', 'organic', 'cpc']
)
SELECT id, trafic_medium,
  ARRAY(
    SELECT AS STRUCT medium, COUNT(1) `count`
    FROM t.trafic_medium medium
    GROUP BY medium
  ) stats
FROM `project.dataset.table` t
-- ORDER BY id   

результат будет

enter image description here

Как вариант - вы можете использовать ниже версию

#standardSQL
SELECT id, 
  ARRAY(
    SELECT AS STRUCT medium, `count`
    FROM t.trafic_medium medium
    LEFT JOIN (
      SELECT AS STRUCT medium, COUNT(1) `count`
      FROM t.trafic_medium medium
      GROUP BY medium
    ) stats
    USING(medium) 
  ) trafic_medium  
FROM `project.dataset.table` t
-- ORDER BY id   

, которая (если применить к тому же манекену data) будет выводиться ниже

enter image description here

Эта версия выглядит более согласованной с ожидаемым результатом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...