我正在尝试在我的组织中创建一个时间点层次结构。 我遇到的问题是,有些人在职业生涯中不止一次向同一位经理汇报。 我尝试对他们的 ID 和经理执行 row_number,但正如预期的那样,当他们向同一经理报告时,计数会继续。 一些示例数据:
身份证 | 经理ID | EFF_DT | EXP_DT | RWNUM |
---|---|---|---|---|
1 | 2 | 2020年5月24日 | 2020年6月30日 | 1 |
1 | 2 | 20202年7月1日 | 2020年8月25日 | 2 |
1 | 2 | 2020年8月26日 | 2020年9月12日 | 3 |
1 | 3 | 2020年10月12日 | 2021 年 1 月 29 日 | 1 |
1 | 3 | 2021 年 1 月 30 日 | 2021 年 5 月 30 日 | 2 |
1 | 3 | 2021 年 5 月 31 日 | 2021 年 7 月 15 日 | 3 |
1 | 4 | 2021 年 7 月 16 日 | 2021 年 8 月 30 日 | 1 |
1 | 4 | 2021 年 9 月 1 日 | 2021 年 9 月 15 日 | 1 |
1 | 2 | 2021 年 9 月 16 日 | 2021 年 12 月 31 日 | 4 |
1 | 2 | 2022 年 1 月 1 日 | 2022 年 3 月 31 日 | 5 |
因此,当该员工向经理 2 报告时,行号计数为 4 和 5。SQL 中有没有办法将其重置并计数为 1 和 2?
所需最终数据示例:
身份证 | 经理ID | EFF_DT | EXP_DT |
---|---|---|---|
1 | 2 | 2020年5月24日 | 2020年9月12日 |
1 | 3 | 2020年10月12日 | 2021 年 7 月 15 日 |
1 | 4 | 2021 年 7 月 16 日 | 2021 年 9 月 15 日 |
1 | 2 | 2021 年 9 月 16 日 | 2022 年 3 月 31 日 |
我认为最好的方法是使用窗口函数,但我无法找出获得此结果的简单方法。 欢迎大家提出建议,谢谢!
我创建的表格错误,然后去编辑它们。 当我完成第一个表时,Stackoverflow 自动保存了编辑,并且不会让我在第二个表上保存此编辑,直到我使正文完全不同,所以我添加这一段希望满足该要求。
如果您想将连续行折叠为单行,可以使用 Teradata
normalize
函数。它仅适用于句点,因此我们必须将您的日期转换为句点。
select
id,
manager_id,
begin(prd) as eff_dt,
last(prd) as exp_dt
from (
select normalize
id,
manager_id,
period(eff_dt,exp_dt + 1) as prd
from
<your table>) t