Скорее всего, причина в том, что есть столбец с тем же именем в исходной таблице . В вашем случае, если есть table1.type
, тогда GROUP BY type
с относится к table1.type
, а не к вашему CASE....END as type
.
В обычном случае вы можете ссылаться на CASE ... END as colname
в предложении GROUP BY
по псевдониму, без необходимости повторять CASE...END
в GROUP BY
. Например, следующие автономные примеры выполняются без проблем:
create or replace temporary table table1 as (
select parse_json(column1) as payload from values
('{"col1": 1, "col2": "aaa"}')
,('{"col1": 1, "col2": "aaa"}')
,('{"col1": 2, "col2": "aaa"}')
,('{"col1": 2, "col2": "bbb"}')
);
select
payload:col1 as col1
,case
when payload:col2 = 'aaa' then 'type1'
else 'other'
end as type
,count(*) as c
from table1
group by col1, type;
-- result:
COL1 TYPE C
1 type1 2
2 type1 1
2 other 1
Это показывает, что вы можете GROUP BY xxx
, где xxx
- это псевдоним столбца case, который использует оператор двоеточия для объекта JSON.
Также вы всегда можете использовать CTE в качестве обходного пути:
with t1 as (
select payload:col1 as col1
, case
when contains(payload:col2, 'aaa') then 'type1'
else 'other'
end as type
from table1
)
select col1
,type
,count(*) as c
group by col1, type
;
В этом случае, если есть table.type
, который не виден в последнем выборе, поэтому group by type
относится кt1.type
а не table1.type
.