雪花中的SQL计算问题-编程问题

时间:2020-10-23 10:05:20

标签: sql snowflake-cloud-data-platform

我有一个表,具有给定的列GroupID,ID,event_time_local(时间戳-yyyy-mm-dd hh:mm:ss数据类型),event_type:

table data

我需要计算如图所示的“ event_number”列。 应该为[GroupID,ID]的每个分区计算它

我编写了以下伪代码进行计算(希望可以,因为我还没有检查它是否可以在包含160,000,000行的整个表上运行)

let weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];

let translatedArray = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"];

let ret = weekdays.reduce((p, c, i) => {
  p[c] = translatedArray[i];
  return p;
}, {});
console.log(ret);
console.log(ret["Tuesday"]); 

我的问题是,在雪花中计算此列以获取易于维护且运行时间高效的优美代码的最佳策略是什么。

我试图用窗口函数来完成它,但是它变得复杂了..而不是优雅的代码。

我会对此有所帮助, 谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用窗口函数来定义分组,然后使用一些算法来执行所需的操作。基本上,您需要:

  • 每个“首次活动”分组的组ID
  • 每个组中“事件”的枚举。
  • 每个“事件”组中“事件双精度”的枚举。

可以使用累计和定义组。其余的是排名功能:

select t.*,
       (dense_rank() over (partition by group_id, id, fe_grp order by e_grp) ||
        (case when event_type = 'event double'
              then  '.' || row_number() over (partition by group_id, id, fe_grp, e_grp order by event_time_local)
              else ''
         end)
        ) as event_number
from (select t.*,
             sum(case when event_type = 'First event' then 1 else 0 end) over (partition by groupid, id order by event_time_local) as fe_grp,
             sum(case when event_type in ('First event', 'event') then 1 else 0 end) over (partition by groupid, id order by event_time_local) as e_grp
       from t
      ) t;