【问题标题】:Assign ranks to records and keep the same rank based on condition为记录分配排名并根据条件保持相同的排名
【发布时间】:2022-11-18 20:18:44
【问题描述】:

假设我们有下表

user_id event_name event_time
Adam subscribe 1
Adam renewal 4
Adam renewal 5
Adam irrelevant event name 6
Adam churn 7
Adam subscribe 10
Adam renewal 20

注意:event_time 实际上以毫秒为单位,但我只是简化了事情。

我想为每一行添加数字,以便最终表格如下所示:

user event_name event_time subscription_id
Adam subscribe 1 1
Adam renewal 4 1
Adam renewal 5 1
Adam irrelevant event name 6 null
Adam churn 7 1
Adam subscribe 10 2
Adam renewal 20 2
Adam renewal 30 2
Adam churn 40 2

最终表的意思是第一行是 Adam 的第一个订阅,因此订阅 ID 为 1。第二行表示 Adam 续订了 ID 1 的订阅,因此续订事件是针对订阅 ID 1。在 n 个续订事件之后,他的第一个订阅结束(流失)。因此,流失事件行的订阅 ID 应为 1。一段时间后,Adam 重新订阅,因此该订阅的 ID 应为 2,并且此订阅后的每个续订事件和流失事件的 ID 也应为 2。

基本上每当 event_name 订阅增量 subscription_id 1 并将其分配给所有相关事件,如果 event_name 无关紧要,只需将 null 分配给 subscription_id

希望我能很好地解释我的问题。 感谢您付出的努力和时间。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可能会考虑以下查询。

    SELECT *,
           -- if event_name is irrelevant just assign null to subscription_id 
           IF(event_name IN ('subscribe', 'renewal', 'churn'),
              -- Everytime a user subscribes again, the user gets a new id increased by one.
              COUNTIF(event_name = 'subscribe') OVER (PARTITION BY user ORDER BY event_time),
              NULL
           ) AS subscription_id
      FROM sample_table;
    

    【讨论】:

    • 你能添加一个解释吗
    • @trillion,我认为在这种情况下代码可以自我解释。无论如何,我已经添加了一些 cmets。如果您认为这还不够,请告诉我。
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2022-07-11
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多