Относительно вашей проблемы, я хотел бы заявить, что это происходит из-за использования:
`UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'"(\w+)":nu`ll'))
Возвращает только последнюю часть col_name (после последней "." ), что приводит к дублированию col_name и, таким образом, в COUNT (1) после группы рассматривается только один.
Однако можно изменить подход и оценивать строки после каждого "." . В вашем случае вы бы оценили два выражения:
- В случае, если у них есть эти два уровня, как в: extension. new.name .
- Также, если указано только одно имя уровня, например: extension. default .
Я использовал простые фиктивные данные ниже, чтобы воспроизвести ваш случай.
WITH data AS (
SELECT 'extension.new.name' as col_name UNION ALL
SELECT 'extension.new.location' as col_name UNION ALL
SELECT 'extension.new.location' as col_name UNION ALL
SELECT 'extension.old.name' as col_name UNION ALL
SELECT 'extension.default' as col_name UNION ALL
SELECT 'extension.category ' as col_name
)
SELECT COALESCE(REGEXP_EXTRACT(col_name,r'(\.\w*\.\w*)'),REGEXP_EXTRACT(col_name,r'(\.\w*)')) as col_name1 from data
group by col_name1
Обратите внимание, что я специально написал столбец с точно таким же именем только для проверки точности. Кроме того, я использовал встроенный метод COALESCE () , который возвращает первое ненулевое выражение вместе с REGEXP_EXTRACT () , который будет:
- Поиск выражений с двумя уровнями, как в: расширение. new.name .
- Поиск выражений с двумя уровнями, как в: extension. default .
Наконец, данные сгруппированы по новому полю col_name1 и вывод выглядит следующим образом:
Поэтому в вашем сценарии для всех вышеприведенных имен будет учитываться COUNT (1) .
Надеюсь, это поможет вам .