之前提问了求实现这样一个功能——简历,有大牛提供了一个非常巧妙的思路,完美的解决了我的问题。但是新的问题出现了,当时我提问的时候,其实没有把可能出现的情况全部考虑到:(,现在情况是这样的:
表结构为:
name(姓名,字符型),ny(年月,字符型,6位,YYYYMM),danwei(单位,字符型),xs1(系数1,数值型,范围(0,1]),xs2(系数1,数值型,范围(0,1])
每月一条数据(ny不一定连续,有断档,因为这个人可能某个月不在这个单位)。ny断档的问题在之前的帖子里已经解决了,现在的问题是:就算是ny连续,但是xs1和xs2发生变化时也要分开统计,就像下面这样的结果:
张三  200507-200512  一队   1    1
张三  200601-200610  一队  0.5   1
张三  200611-200703  一队   1    1
如上,时间是连续的,200507-200703,但是xs1(或xs2)在中间一段时间发生了变化,就必须要重新开始。泪盼大牛出现!

解决方案 »

  1.   


    -- 测试数据
     WITH t AS
      (
        SELECT '张三' name, to_date('200012','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
        SELECT '张三' name, to_date('200101','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
        SELECT '张三' name, to_date('200102','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
        SELECT '张三' name, to_date('200103','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
        
        -- 缺少 2001.04
        SELECT '张三' name, to_date('200105','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
        SELECT '张三' name, to_date('200106','YYYYMM') ny,'一队' danwei FROM dual UNION ALL
        
        -- 缺少 2001-07 ~ 2001-12
        SELECT '张三' name, to_date('200201','YYYYMM') ny,'一队' danwei FROM dual
           ) -- 查询SQL
        -- 注,解决断档问题
       SELECT name,MIN(ny) "开始日期" ,MAX(ny) "结束日期", danwei
           FROM (  
           SELECT name,danwei,ny
                  ,add_months(ny ,-ROWNUM) "分段标识"  -- 注意, 排序 + 分组(按相同标识位、断档 = 标识不同)
                                                          -- 注, 使用 add_months 是解决 日期跨年的问题
                  FROM t
                ORDER BY NAME,ny,danwei
                )
           GROUP BY NAME,danwei,"分段标识"
          ORDER BY NAME,2,3;
      

  2.   

    coolkisses兄,你这段代码只是我上一个帖子的答案啊,请再仔细看下这次的问题。继续泪盼大牛出现!
      

  3.   

    把中断的补全之后,用窗口查个排名,然后用判断值(xs1或者xs2)做差,用差值和人员分组。