使用snowflake sql。
所以我的表有两列:hour和customerid。每位顾客将有两排,一排对应他/她进入商店的时间,一排对应他/她离开商店的时间。有了这些数据,我想创建一个表,该表包含客户在商店的每一个小时。例如,一个客户x在下午1点进入商店,下午5点离开,因此将有5行(每小时1行),如下面的屏幕截图所示。
我的尝试是:
select
hour
,first_value(customer_id) over (partition by customer_id order by hour rows between unbounded preceding and current row) as customer_id
FROM table
2条答案
按热度按时间xe55xuns1#
在snowflake中,通常使用一个数字表来解决这个问题。你可以用
table (generator ...)
生成此类派生表的语法,然后将其与聚合查询联接,聚合查询使用不等式条件计算每个客户端的小时边界:这将处理每个客户最多24小时的访问。如果需要更多,则可以增加表生成器的参数。
5lhxktic2#
因此,对于测试数据中显示的示例情况,只有一天的数据,gmb的解决方案可以很好地工作。
一旦你进入许多天(可以/不可以有重叠的商店访问,让我们假装你不能在商店过夜)
可通过以下方式固定:
但多个条目需要标签数据,如:
或者可以推断:
给:
现在可以使用滞后和限定来获得可以处理多个条目的真实范围:
它的工作原理是,为每天/客户的所有行获取下一次的时间,然后(通过qualify)只保留“in”行。
然后我们可以加入到一天中的时间:
因此,这一切编织在一起
我们得到: