【发布时间】:2013-02-19 17:29:22
【问题描述】:
我正在尝试查找带有中断处理日期的给定值的以下数据的最小和最大处理日期(请注意,周末不处理行,如果它们不希望将它们分成两个不同的集合具有相同的值)
SELECT 1, 'A',to_date('10/01/2012','dd/mm/yyyy'), 10, to_date('11/01/2012','dd/mm/yyyy') FROm DUAL
UNION ALL SELECT 1, 'A',to_date('11/01/2012','dd/mm/yyyy'), 10, to_date('12/01/2012','dd/mm/yyyy') FROm DUAL
UNION ALL SELECT 1, 'A',to_date('12/01/2012','dd/mm/yyyy'), 9, to_date('13/01/2012','dd/mm/yyyy') FROm DUAL
UNION ALL SELECT 1, 'A',to_date('13/01/2012','dd/mm/yyyy'), 9, to_date('14/01/2012','dd/mm/yyyy') FROm DUAL
UNION ALL SELECT 1, 'A',to_date('16/01/2012','dd/mm/yyyy'), 9, to_date('17/01/2012','dd/mm/yyyy') FROm DUAL
UNION ALL SELECT 1, 'A',to_date('17/01/2012','dd/mm/yyyy'), 10, to_date('18/01/2012','dd/mm/yyyy') FROm DUAL
UNION ALL SELECT 1, 'A',to_date('18/01/2012','dd/mm/yyyy'), 10, to_date('19/01/2012','dd/mm/yyyy') FROm DUAL;
我的尝试(我知道这是错误的)
SELECT id, cd, value, min(p_dt) min_dt, max(p_dt) max_dt FROM T
group by id, cd, value;
返回
ID CD VALUE MIN_DT MAX_DT
----------------------------------------------------------------------------------
1 A 9 January, 12 2012 00:00:00+0000 January, 16 2012 00:00:00+0000
1 A 10 January, 10 2012 00:00:00+0000 January, 18 2012 00:00:00+0000
我要返回的是
ID CD VALUE MIN_DT MAX_DT
----------------------------------------------------------------------------------
1 A 9 January, 12 2012 00:00:00+0000 January, 16 2012 00:00:00+0000
1 A 10 January, 10 2012 00:00:00+0000 January, 11 2012 00:00:00+0000
1 A 10 January, 17 2012 00:00:00+0000 January, 18 2012 00:00:00+0000
我尝试了不同的方法来查询这个,但我无法提供有效的查询。
【问题讨论】:
-
抱歉,我不明白您拆分日期的理由。你能解释一下吗?我相信您正在查看 gaps-and-islands 问题,但我不能确定。
-
@ben,如果你看到数据 A 代码有 10 个值,从 01/10 到 01/11 和 01/17 到 01/18 有效,值 9 从 01/12 到 01/ 16.我想返回值的最大和最小日期,并根据这些日期在其他表中更新该值。现在从我的原始查询中,它有两个值 9,10 用于日期范围 01/12 到 01/16,这是不正确的。
-
@ben,2012 年 1 月 14 日和 15 日是周末
-
嗯,那个周末的问题让事情变得更复杂了!