Как я могу считать повторяющиеся значения в строке в BigQuery? - PullRequest
0 голосов
/ 04 апреля 2020

Пример: у меня есть следующая строка: 201904, BLANK, 201902, BLANK, BLANK, 201811,201810,201809 Как подсчитать количество повторяющихся значений «BLANK», которые идут одно за другим? В описанном примере ответ 2, но каков запрос? Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Возможно, я неправильно понял, но вы не можете просто разделить на искомое значение и вычесть 2 (1 для первого элемента и 1 для подсчета элементов после разделения):

declare t DEFAULT '201904,BLANK,201902,BLANK,BLANK,201811,201810,201809';

SELECT 
  t as theString,
  split(t,'BLANK') as theSplittedString,
  array_length(split(t,'BLANK'))-2 as theAmount

n > 0 - количество повторений, 0 - без повторений, -1 - элемент не найден

0 голосов
/ 04 апреля 2020

Ниже для BigQuery Standard SQL (с быстрым упрощенным примером)

Исправленная версия

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '201904,BLANK,201902,BLANK,BLANK,201811,201810,201809,BLANK,BLANK,BLANK' value UNION ALL
  SELECT '201904,BLANK,201902,BLANK,BLANK,BLANK,201811' UNION ALL
  SELECT '201904,BLANK,201902,BLANK,201811,201902,BLANK,201811'
)
SELECT value, 
  (
    SELECT MAX(ARRAY_LENGTH(SPLIT(list))) - 1 
    FROM UNNEST(REGEXP_EXTRACT_ALL(value || ',', r'(?:BLANK,){1,}')) list
  ) max_repeated_count
FROM `project.dataset.table`     

Идея здесь

  • извлекает все экземпляры подряд BLANK
  • разбивает каждый такой экземпляр на массив элементов BLANK
  • и в итоге получает максимальную длину этих массивов в результате

Просто что-то пришло как быстрый подход

Рефакторированная версия

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '201904,BLANK,201902,BLANK,BLANK,201811,201810,201809,BLANK,BLANK,BLANK' value UNION ALL
  SELECT '201904,BLANK,201902,BLANK,BLANK,BLANK,201811' UNION ALL
  SELECT '201904,BLANK,201902,BLANK,201811,201902,BLANK,201811'
)
SELECT value, 
  (
    SELECT MAX(LENGTH(element) - 1) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(REPLACE(value || ',', 'BLANK', ''), r',+')) element
  ) max_repeated_count
FROM `project.dataset.table`    

Оба с выводом

Row value                                                                   max_repeated_count   
1   201904,BLANK,201902,BLANK,BLANK,201811,201810,201809,BLANK,BLANK,BLANK  3    
2   201904,BLANK,201902,BLANK,BLANK,BLANK,201811                            3    
3   201904,BLANK,201902,BLANK,201811,201902,BLANK,201811                    1

Рефакторированная версия немного отличается (но основная Идея та же)

  • удаляет все пустые (при условии, что пустая не может быть частью другого элемента - если это возможно - код может быть легко откорректирован)
  • затем извлекаем все последовательные записи запятых в массив
  • вычисляет максимальную длину таких последовательностей запятых
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...