【发布时间】:2013-09-03 12:55:49
【问题描述】:
我已经编写了以下查询,但不幸的是它不起作用。我想要实现的是,我为每一行选择的日期是客户关系的生效日期。
ci_per_per 表包含以下列:
per_id1、per_id2、start_dt、end_dt
per_id1 是父级,per_id2 是子级。
start_dt 和 end_dt 定义关系的持续时间
SELECT
CONNECT_BY_ROOT per_id2 AS per_id2,
per_id1,
(CASE WHEN start_dt < (PRIOR start_dt1)
THEN (PRIOR start_dt1)
ELSE start_dt
END) AS start_dt1,
(CASE WHEN end_dt > (PRIOR end_dt1)
THEN (PRIOR end_dt1)
ELSE end_dt
END) AS end_dt1,
level AS "PER_LEVEL"
FROM ci_per_per
CONNECT BY NOCYCLE PRIOR per_id1 = per_id2
我得到的 sql 错误是:END_DT1: Invalid identifier.
有没有办法在 oracle 中实现这个功能?
示例场景:
per_id1 | per_id2 | start_dt | end_dt
-------------------------------------------
B | A | 01-01-2011 | 01-01-2011
C | B | 01-01-2010 | 01-01-2010
E | B | 01-01-2011 | 01-01-2014
D | C | 01-01-2009 | 01-01-2015
现在我希望所有记录都以01-01-2011 作为开始日期。但是,如果层次结构颠倒(意味着交换 per_id_1 和 Per_id2 值),则记录应按原样显示。
请注意,对于上面的示例,我们需要使用带有per_id2='A' 条件的start with 子句来运行它。此外,请了解如果您使用 per_id2='B' 运行查询,结果可能会发生变化
因此,当我以per_id2='B' 开头时,结果应该使所有记录都为01-01-2010 而不是01-01-2011
现在有了结束日期,所有记录都应该是01-01-2011,除了带有 E 的记录和带有 A 的记录。其中结束日期将是 null(假设我们从 A 开始)。
【问题讨论】:
-
我怀疑你必须使用递归子查询分解(递归 CTE)才能实现这一点。
-
您能详细说明一下吗?提前致谢!
-
您是否试图获取层次结构中最低的开始日期和结束日期?
-
仍然不完全清楚你想要什么。如果在您的示例中,第二行 (C/B) 是 01-01/2013 怎么办?您想要层次结构中任意位置的最高值,还是当前级别以下的最高值?
-
@Joe,谢谢提问,我想要低于当前水平的最高值。
标签: sql database oracle hierarchy connect-by