Есть ли другой способ использовать ...?
Вы не должны бояться UNNEST только потому, что он «не будет» CROSS JOIN
Хитрость заключается в том, что несмотря на то, что перекрестное соединение, но это перекрестное соединение в строке только и глобальными для всех строк в таблице. В то же время, всегда есть способ сделать вещи различных
Так, в приведенном ниже примере 1 - представляет фиктивный пример использования UNNEST
А потом Пример 2 - показывает, как сделать то же самое без использования UNNEST, а с помощью SQL UDF
Вы не представили специфику о вашем случае, поэтому ниже достаточно универсален, чтобы показать «других» способ
с Flattening via UNNEST
#standardSQL
WITH yourTable AS (
SELECT 1 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>>
[(1,'y','a','xxx'),(2,'n','b','yyy'),(3,'y','c','zzz'),(4,'n','d','vvv')] AS type UNION ALL
SELECT 2 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>>
[(11,'t','c','xxx'),(21,'n','a','yyy'),(31,'y','c','zzz'),(41,'f','d','vvv')] AS type
)
SELECT id, SUM(t.details) AS details
FROM yourTable, UNNEST(type) AS t
WHERE t.flag = 'y'
GROUP BY id
с SQL UDF
#standardSQL
CREATE TEMP FUNCTION do_something (
type ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>>
)
RETURNS INT64 AS ((
SELECT SUM(t.details) AS details
FROM UNNEST(type) AS t
WHERE t.flag = 'y'
));
WITH yourTable AS (
SELECT 1 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>>
[(1,'y','a','xxx'),(2,'n','b','yyy'),(3,'y','c','zzz'),(4,'n','d','vvv')] AS type UNION ALL
SELECT 2 AS id, ARRAY<STRUCT<details INT64, flag STRING, value STRING, description STRING>>
[(11,'t','c','xxx'),(21,'n','a','yyy'),(31,'y','c','zzz'),(41,'f','d','vvv')] AS type
)
SELECT id, do_something(type) AS details
FROM yourTable
Что вы пытаетесь сделать с этой колонкой? Какие вопросы вы пробовали до сих пор? –
Мы пытаемся присоединиться к этой таблице с несколькими таблицами для предоставления данных в отчет Tableau. Производительность поражает это. – Safiyur