【问题标题】:dense_rank over boolean column布尔列上的dense_rank
【发布时间】:2021-05-17 17:57:03
【问题描述】:

美好的一天。我有一个有条件的置换表,我正在运行 redshift DB。这是一个包含事件日志的表,我将其拆分为会话开始 (bool = 1) 和会话继续 (bool = 0),如下所示:

=======================
| ID    |  BOOL      |
=======================
|  1    |      0     |
|  2    |      1     | 
|  3    |      0     |
|  4    |      0     |
|  5    |      0     |
|  6    |      0     |
|  7    |      0     |
|  8    |      0     |
|  9    |      0     |
|  10   |      0     |
|  11   |      1     | 
|  12   |      0     |
|  13   |      0     |
|  14   |      1     |
|  15   |      0     |
|  16   |      0     |
=======================

我需要用dense_rank 之类的东西创建sesssion_id 列:

================================
| ID    |  BOOL      |  D_RANK |
================================
|  1    |      0     |    1    |
|  2    |      1     |    2    | 
|  3    |      0     |    2    |
|  4    |      0     |    2    |
|  5    |      0     |    2    |
|  6    |      0     |    2    |
|  7    |      0     |    2    |
|  8    |      0     |    2    |
|  9    |      0     |    2    |
|  10   |      0     |    2    |
|  11   |      1     |    3    |
|  12   |      0     |    3    |
|  13   |      0     |    3    |
|  14   |      1     |    4    |
|  15   |      0     |    4    |
|  16   |      0     |    4    |
================================

有没有办法做到这一点?将不胜感激。

【问题讨论】:

  • 我认为第二行的值应该是2而不是1
  • 是的,你是对的

标签: sql amazon-redshift window-functions dense-rank


【解决方案1】:

使用累积和。假设bool 是新会话的开始:

select t.*,
       sum(bool) over (order by id) as session_id
from t;

注意:这将从0 开始。需要的话可以加1

【讨论】:

    猜你喜欢
    • 2016-09-16
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2015-07-10
    相关资源
    最近更新 更多