组内的条件行编号

Posted

技术标签:

【中文标题】组内的条件行编号【英文标题】:Conditional row numbering within groups 【发布时间】:2021-09-15 20:08:35 【问题描述】:

我的表格如下所示:

ID Dummy Date
3 1 01.01.2021
3 1 01.02.2021
3 1 01.03.2021
3 0 01.04.2021
3 1 01.05.2021
3 0 01.06.2021
3 0 01.07.2021
3 0 01.08.2021
3 1 01.09.2021
3 1 01.10.2021
4 0 01.01.2021
4 0 01.02.2021
4 0 01.03.2021
4 1 01.04.2021
4 1 01.05.2021
4 0 01.06.2021
4 1 01.07.2021
4 0 01.08.2021
4 1 01.09.2021
4 1 01.10.2021

首先,在每个 ID 组内,我想确定 Dummy 列中的序列。 序列只能容忍 2 个或更少的连续零。 一种方法是创建 2 个滞后、2 个领先,总结 5 个虚拟变量(同时使用 COALESCE 表示滞后和领先)并过滤一个条件是所有 5 的总和应该大于或等于 3。

第二步是我真正卡住的地方。

我想在每次将它们递增 1 的同时对这些组进行编号,并说明相关的最小和最大日期。所需的输出应如下表所示。

愿望输出:

ID Group Start End
3 1 01.01.2021 01.05.2021
3 2 01.09.2021 01.10.2021
4 1 01.04.2021 01.05.2021
4 2 01.07.2021 01.07.2021
4 3 01.09.2021 01.10.2021

【问题讨论】:

你用的是什么版本的oracle? @Boneist 应该是12g 这真的是在尖叫“MATCH_RECOGNIZE!”在我看来,但对于我的生活,我想不出如何表达“1 后跟任意数量的 1 或最多两个连续的 0”的模式。这就是为什么我问什么版本,因为它只能从 12c 开始。 @Boneist 你很可能是对的。我重申了这个问题,给出的答案与您的相同。 ***.com/questions/69205564/… 【参考方案1】:

这回答了问题的原始版本。

嗯。 . .我在想。数出零,然后根据数字除以 2 将行分组。

select id, min(date), max(date),
       row_number() over (partition by id order by min(date)) as grouping
from (select t.*,
             sum(dummy - 1) over (partition by id order by date) as seqnum
      from t
     ) t
where dummy = 1
group by id, ceil(seqnum / 2);

【讨论】:

我注意到我遗漏了一个关键部分。我说过“序列只能容忍 2 个或更少的零。”但是,它应该是 2 个或更少的连续零。 @Larx 。 . .也许您应该提出一个新的问题,并提供适当的样本数据和所需的结果。 样本和期望的结果与我真正想做的一致。问题是我编辑的问题的措辞。

以上是关于组内的条件行编号的主要内容,如果未能解决你的问题,请参考以下文章

组内的 Cumsum 并在 pandas 的条件下重置

熊猫:Groupby,循环并添加一小时迭代与组内的条件

R条件求和(组内条件)

按时间戳对组内的行进行排序

对行编号并在特定条件下将计数器重置为 1

如何在 Pig 中动态获取组内的前 N% 记录