Redshift Row_Number() 查询重新启动的分区

Posted

技术标签:

【中文标题】Redshift Row_Number() 查询重新启动的分区【英文标题】:Redshift Row_Number() Query with partitions that restart 【发布时间】:2020-09-04 18:10:57 【问题描述】:

我有带有 id、timestamp(ts) event、capital_event_bool 和 prev_event_capital_bool 的数据。

id   ts          event   capital_event_bool    prev_event_capital_bool
001   00:01       a          0                     0
002   00:02       b          0                     0
002   00:03       b          0                     0
002   00:04       b          1                     0
002   00:05       c          0                     1
003   00:03       c          0                     0
003   00:04       b          0                     0
003   00:05       b          1                     0
003   00:06       b          0                     1
003   00:07       b          0                     0
003   00:08       b          1                     0

只有“b”事件可以有一个 capital_event_bool = True。 我想要完成的是有一种方法来计算所有capital_event_bool = False b 事件之前每个capital_event_bool = 每个id 的True 事件。我原本以为我可以通过 Redshift 中的 row_number() 窗口函数来实现这一点

ROW_NUMBER() OVER (PARTITION BY id, event, capital_event_bool  ORDER BY ts) AS row_num

但让我感到困惑的部分是如何在每个 capital_event_bool = True 事件后重新开始计数。如果行编号将在每个 capital_event_bool = True 事件处停止然后重新开始,那很好,因为我可以使用带有 capital_event_bool 的 case 语句来达到我的最终结果。

row_num      DESIRED only row_num       Final Desired Result   
1              1                                0
1              1                                0
2              2                                0
1              3                                2
1              1                                0
2              2                                0
1              1                                0
1              2                                1
2              1                                0
3              2                                0 
2              3                                2

【问题讨论】:

【参考方案1】:

这是一种孤岛问题。基本上,您需要通过“b”列中“1”的数量来定义数据的子集。为此,capital_event_bool 的逆和完全符合您的要求。然后,您可以在该组上使用窗口函数:

select t.*,
       (case when capital_event_bool = 1
             then sum( (event = 'b')::int ) over (partition by id, grp) - 1
             else 0
        end) as final_result
from (select t.*,
             sum(capital_event_bool) over (partition by id order by ts desc) as grp
      from t
     ) t

【讨论】:

一些细节对我来说有点不对劲(即 (event = 'b')::int) 在特定实例中引发了错误,但总体思路是正确的,并且进行了少量修改和集成到我的用例中,它起作用了。谢谢!

以上是关于Redshift Row_Number() 查询重新启动的分区的主要内容,如果未能解决你的问题,请参考以下文章

“PB 级”Redshift 使用超过 500 MB 的内存来对 848.00 KB 的数据进行排序

在 Redshift dplyr 操作中重命名汇总列

如何在此查询中使用 ROW_NUMBER? [关闭]

克隆数据库过程

sql 查询与 Row_Number 不同

如何在 Hibernate 中使用 row_number 函数编写查询?