在源中,我们有一个变体列(事件),我们需要总结该列中的指标(通话次数、展示次数、潜在客户、访问次数等)。
指标的数量可能有所不同。例如前 4 行有 4 个指标,第 5 行有 5 个指标,第 6 行有 3 个指标。
这里是创建表和插入示例数据的源代码。
CREATE OR REPLACE TABLE user_activity (
ACTIVITY DATE,
ID NUMBER ,
NAME VARCHAR ,
EVENTS VARIANT
);
INSERT INTO user_activity (activity, id, name, events)
SELECT '2023-09-05'::date, 101, 'Pink Panther', PARSE_JSON('{ "imps": "Y", "visits": "Y", "calls": "N", "leads": "N" }');
INSERT INTO user_activity (activity, id, name, events)
SELECT '2023-09-05'::date, 102, 'Pink Panther', PARSE_JSON('{ "imps": "Y", "visits": "Y", "calls": "N", "leads": "N" }');
INSERT INTO user_activity (activity, id, name, events)
SELECT '2023-09-05'::date, 103, 'Pink Panther', PARSE_JSON('{ "imps": "Y", "visits": "N", "calls": "Y", "leads": "N" }');
INSERT INTO user_activity (activity, id, name, events)
SELECT '2023-09-05'::date, 104, 'Pink Panther', PARSE_JSON('{ "imps": "Y", "visits": "N", "calls": "N", "leads": "Y" }');
INSERT INTO user_activity (activity, id, name, events)
SELECT '2023-09-06'::date, 105, 'Pink Panther', PARSE_JSON('{ "imps": "Y", "visits": "N", "calls": "N", "leads": "Y", "service": "Y" }');
INSERT INTO user_activity (activity, id, name, events)
SELECT '2023-09-06'::date, 106, 'Pink Panther', PARSE_JSON('{ "imps": "Y", "visits": "Y", "calls": "N" }');
如果指标值为“Y”,我们将添加 1,否则添加 0。
这是我正在进行的工作:
SELECT
activity
, name
, events AS total_events -- need help to calculate this
, (CASE WHEN events:calls::string='Y' THEN 1 ELSE 0 END) AS calls
, (CASE WHEN events:imps::string='Y' THEN 1 ELSE 0 END) AS imps
, (CASE WHEN events:leads::string='Y' THEN 1 ELSE 0 END) AS leads
, (CASE WHEN events:visits::string='Y' THEN 1 ELSE 0 END) AS visits
, (CASE WHEN events:service::string='Y' THEN 1 ELSE 0 END) AS service
FROM user_activity,
lateral flatten(events) f
GROUP BY 1,2,3
ORDER BY 1;
我需要帮助来总结 total_events 文件夹中的指标,如目标输出所示。
不完全一样,但几乎是你想要的。
这将添加total_events中的所有列
select *,OBJECT_CONSTRUCT(*) total_events
from(
select
activity
, name
,sum(calls) calls
,sum(imps) imps
,sum(leads) leads
,sum(visits) visits
,sum(service) service
from (
SELECT
activity
, name
, events AS total_events -- need help to calculate this
, (CASE WHEN events:calls::string='Y' THEN 1 ELSE 0 END) AS calls
, (CASE WHEN events:imps::string='Y' THEN 1 ELSE 0 END) AS imps
, (CASE WHEN events:leads::string='Y' THEN 1 ELSE 0 END) AS leads
, (CASE WHEN events:visits::string='Y' THEN 1 ELSE 0 END) AS visits
, (CASE WHEN events:service::string='Y' THEN 1 ELSE 0 END) AS service
FROM user_activity,
lateral flatten(events) f
GROUP BY 1,2,3
)
group by 1,2
);
ORDER BY 1