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

雪花编程问题中的SQL计算问题,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我有一个具有给定列GroupID、ID、event_time_local(timestamp-yyyy-mm-dd hh:mm:ss数据类型)、event_类型的表: 我需要计算“事件编号”列,如图所示。 应该为[GroupID,ID]的每个分区计算它 我编写了以下用于计算的伪代码(希望没有问题,因为我还没有在包含160000000行的整个表上检查它) 我的问题是,在snowflake中计算此列以获得易于维护且运行时间高效的优雅代码的最佳策略是什么 我试着用窗口函数来实现它,但它变得复杂了。。

我有一个具有给定列GroupID、ID、event_time_local(timestamp-yyyy-mm-dd hh:mm:ss数据类型)、event_类型的表:

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

我编写了以下用于计算的伪代码(希望没有问题,因为我还没有在包含160000000行的整个表上检查它)

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

我试着用窗口函数来实现它,但它变得复杂了。。而不是优雅的代码

我会很感激你的帮助,
谢谢

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

  • 每个“第一个事件”分组的组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;
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;