组内的条件行编号
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 。 . .也许您应该提出一个新的问题,并提供适当的样本数据和所需的结果。 样本和期望的结果与我真正想做的一致。问题是我编辑的问题的措辞。以上是关于组内的条件行编号的主要内容,如果未能解决你的问题,请参考以下文章