STRING_AGG в Bigquery - PullRequest
       7

STRING_AGG в Bigquery

2 голосов
/ 14 июля 2020

У меня проблема с STRING_AGG в Bigquery. Я пытаюсь:

SELECT
 id,
 institution,
 COUNT(DISTINCT institution)  OVER (PARTITION BY id) as count_intitution
 STRING_AGG(DISTINCT institution,"," )  OVER (PARTITION BY id) as list_intitution
FROM
 name_table
WHERE
 DATE(created_at) = "2020-02-02"

и получаю эту ошибку:

Analyti c функция string_agg не поддерживает DISTINCT.

BQ в документации говорится, что разрешено использование «DISTINCT»

https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#string_agg

Но, по-видимому, он не поддерживает «разделение по», почему?

РЕДАКТИРОВАТЬ:

текущая таблица выглядит так (это пример, таблица имеет больше атрибутов)

|id |institution|
|1  | a         |
|1  | b         |
|2  | a         |
|2  | c         |
|3  | a         |
|1  | a         |

и я хочу достичь

|id|count_institution|list_institution|
|1 |2                |a,b             |
|2 |2                |a,c             |
|3 |1                |a               |

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Ниже приведено значение для BigQuery Standard SQL

#standardSQL
SELECT * 
  REPLACE((
      SELECT STRING_AGG(DISTINCT i) FROM t.list_intitution i
    ) AS list_intitution
  ) 
FROM (
  SELECT
   id,
   institution,
   COUNT(DISTINCT institution)  OVER (PARTITION BY id) AS count_intitution,
   ARRAY_AGG(institution) OVER (PARTITION BY id) AS list_intitution
  FROM
   name_table
  WHERE
   DATE(created_at) = "2020-02-02"
) t  

Примечание: в исходном запросе вы просто удаляете DISTINCT и используете ARRAY_AGG вместо STRING_AGG, но затем во внешнем запросе вы обрабатываете этот массив для формирования списка отдельные значения из этого массива

Ниже приведен ответ на ваш обновленный вопрос

Вы можете просто использовать GROUP BY, как в примере ниже

#standardSQL
SELECT id, 
  COUNT(DISTINCT institution) AS count_institution,
  STRING_AGG(DISTINCT institution) AS list_institution
FROM name_table
GROUP BY id

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

#standardSQL
WITH name_table AS (
  SELECT 1 id, 'a' institution UNION ALL
  SELECT 1, 'b' UNION ALL
  SELECT 2, 'a' UNION ALL
  SELECT 2, 'c' UNION ALL
  SELECT 3, 'a' UNION ALL
  SELECT 1, 'a' 
)
SELECT id, 
  COUNT(DISTINCT institution) AS count_institution,
  STRING_AGG(DISTINCT institution) AS list_institution
FROM name_table
GROUP BY id

результат

Row id  count_institution   list_institution     
1   1   2                   a,b  
2   2   2                   a,c  
3   3   1                   a    
0 голосов
/ 14 июля 2020

Обновлено на основе вашего обновленного вопроса. Вы могли просто не использовать window functions.

with cte1 as
(select distinct id, institution
from name_table
where date(created_at) = "2020-02-02")

select id, count(institution) count_inst, string_agg(institution,"," ) list_inst
from cte1 
group by id;

Выходы

+----+------------+-----------+
| id | count_inst | list_inst |
+----+------------+-----------+
|  1 |          2 | a,b       |
|  2 |          2 | a,c       |
|  3 |          1 | a         |
+----+------------+-----------+
0 голосов
/ 14 июля 2020

Вы можете легко обойти это:

SELECT id, institution,
       COUNT(DISTINCT institution)  OVER (PARTITION BY id) as list_intitution
       STRING_AGG(CASE WHEN seqnum = 1 THEN institution END, ',')  OVER (PARTITION BY id) as list_intitution
FROM (SELECT t.*, 
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) as seqnum
      FROM name_table
      WHERE DATE(created_at) = '2020-02-02'
     ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...