SELECT
Email,
Send_Date,
Open_Date,
CASE WHEN Open_Date IS NOT NULL THEN
COUNT(*) OVER (PARTITION BY Email, GroupId ORDER BY Send_Date)
END AS CountTilOpen
FROM (
SELECT *,
COUNT(Open_Date) OVER (PARTITION BY Email ORDER BY Send_Date)
- CASE WHEN Open_Date IS NULL THEN 0 ELSE 1 END
AS GroupId
FROM YourTable t
) t;
这是一种差距和孤岛问题。有许多不同的解决方案。
由于
COUNT(SomeValue)
只会计算非空值,因此您可以使用窗口计数来计算每个岛的分组 ID。我们为不为空的每一行减去 1,以便将其保留为前一组的一部分
然后我们使用另一个窗口化
COUNT
来获得最终结果,这次也按组 ID 进行分区。