如何填充一列以区分 Impala 组中的一组行与其他行?

Posted

技术标签:

【中文标题】如何填充一列以区分 Impala 组中的一组行与其他行?【英文标题】:How to fill a column to differentiate a set of rows from other rows in a group in Impala? 【发布时间】:2020-11-19 18:05:15 【问题描述】:

我在 Impala 中有下表。

|LogTime|ClientId|IsNewSession|
|1      |123     |1           |
|2      |123     |            |
|3      |123     |            |
|3      |666     |1           |
|4      |666     |            |
|10     |123     |1           |
|23     |666     |1           |
|24     |666     |            |
|25     |444     |1           |
|26     |444     |            |

我要新建一个表格如下:

|LogTime|ClientId|IsNewSession|SessionId|
|1      |123     |1           |1        |
|2      |123     |            |1        |
|3      |123     |            |1        |
|3      |666     |1           |1        |
|4      |666     |            |1        |
|10     |123     |1           |2        |
|23     |666     |1           |2        |
|24     |666     |            |2        |
|25     |444     |1           |1        |
|26     |444     |            |1        |

基本上,我想让SessionId 列在每组行中都有一个唯一的会话ID,直到IsNewSession 列中的1 值在ClientId 分组之后,以区分每个@987654327 的不同会话@。

我已经创建了IsNewSession 列,但不确定如何迭代行以创建SessionId 列。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您可以使用累积和:

select t.*,
       sum(isnewsession) over (partition by clientid order by logtime) as sessionid
from t;

【讨论】:

哇,不知道这个!感谢您的明确回答! :)

以上是关于如何填充一列以区分 Impala 组中的一组行与其他行?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新除该组中最新项目之外的一组行

如何根据列中的一组行对数据框进行排名?

如何在每个组中估算熊猫数据框中的一列[重复]

透视列以填充另一列中的值

Mysql,如何使用另一列的最大值对一组行进行分组?

注释掉 shell 脚本中的一组行