变体列计算

问题描述 投票:0回答:1

在源中,我们有一个变体列(事件),我们需要总结该列中的指标(通话次数、展示次数、潜在客户、访问次数等)。

指标的数量可能有所不同。例如前 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 文件夹中的指标,如目标输出所示。

sql database snowflake-cloud-data-platform variant
1个回答
0
投票

不完全一样,但几乎是你想要的。

这将添加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
© www.soinside.com 2019 - 2024. All rights reserved.