就是一个表w1中有 开始EFCT_BEG_DT 和结束EFCT_END_DT两个时间字段。现在按要求按主键分组MODEL_Y_CD。 
如何写SQL判断这个表中,开始到结束的期间段中的时间是否有重复的。 就是时间是否覆盖了,重叠了。20090105  20090115
20090114  20090130   如这样的两天数据就是不合法的。 求救了

解决方案 »

  1.   

    select EFCT_BEG_DT, EFCT_END_DT, LEAD(EFCT_BEG_DT,1,EFCT_END_DT) over(ORDER BY MODEL_Y_CD) EFCT from w1 意思是取了下一条的开始时间这样3列你想做什么操作都可以了~ 也可以判断数据是否合理了~
      

  2.   

    本帖最后由 c_hua6280 于 2011-02-24 09:53:23 编辑
      

  3.   

    oracle 统计分析函数 lead     语法结构:     lead(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)     参数说明:     value_expr 值表达式,通常是字段,也可是是表达式。value_expr本身不支持分析函数,也就是lead不支持多层调用。
         offset 偏移,应该是很熟悉的数学概念了,或者是相对偏移,表格来开当前行的第offset行,如果offset是整数就表示是顺序下的前第n行,如果是负数就是往后第n行。 如果不提供这个参数,就是默认为1.
          default 默认值,如果没有找到,应该返回什么值的意思,有点类似nvl(col,value)。如果没有设置,且找不到,那么就返回Null
          over  可以简单地翻译为在什么的基础之上
          query_partition_clause  分区语句,对结果集合分区的语句,是可选的,如果没有就是所有的一个分区。
          Order_by_clause 排序语句 必须需要 ,形如order by xxx desc/asc     解释示例:
         SQL> select * from test_value;
           
                  MONS JJR               CJL       CJJE
            ---------- ---------- ---------- ----------
                200801 LZF               250       1999
                200802 LZF               200       2000
                200803 LZF               300       1000
                200804 LZF                23        189
                200805 LZF               356        456
                200806 LZF               100        200
                200807 LZF               600        700
                200808 LZF                23        123
                200809 LZF               400        500
           
            9 rows selected
           
            SQL>
            SQL> select rownum 序号,Mons,cjl cjl_01,
              2  lead(cjl,1) over (order by mons desc) cjl_02,
              3  lead(cjl,2) over (order by mons desc) cjl_03,
              4  lead(cjl,3) over (order by mons desc) cjl_04,
              5  lead(cjl,4) over (order by mons desc) cjl_05,
              6  lead(cjl,5) over (order by mons desc) cjl_06,
              7  lead(cjl,6) over (order by mons desc) cjl_07,
              8  lead(cjl,7) over (order by mons desc) cjl_08,
              9  lead(cjl,8) over (order by mons desc) cjl_09
             10   from test_value              序号       MONS     CJL_01     CJL_02     CJL_03     CJL_04     CJL_05     CJL_06     CJL_07     CJL_08     CJL_09
            ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
                     9     200809        400         23        600        100        356         23        300        200        250
                     8     200808         23        600        100        356         23        300        200        250
                     7     200807        600        100        356         23        300        200        250           
                     6     200806        100        356         23        300        200        250                      
                     5     200805        356         23        300        200        250                                 
                     4     200804         23        300        200        250                                            
                     3     200803        300        200        250                                                       
                     2     200802        200        250                                                                  
                     1     200801        250                    实践使用示例:            select id,lead(id,1)over(partition by  call_req_id order by call_req_id ,id),type,analyst,time_stamp from act_log order by call_req_id ,id
      

  4.   

    oracle 统计分析函数 lead     语法结构:     lead(value_expr [,offset][,default]) over([query_partition_clause] order by Order_by_clause)     参数说明:     value_expr 值表达式,通常是字段,也可是是表达式。value_expr本身不支持分析函数,也就是lead不支持多层调用。
         offset 偏移,应该是很熟悉的数学概念了,或者是相对偏移,表格来开当前行的第offset行,如果offset是整数就表示是顺序下的前第n行,如果是负数就是往后第n行。 如果不提供这个参数,就是默认为1.
          default 默认值,如果没有找到,应该返回什么值的意思,有点类似nvl(col,value)。如果没有设置,且找不到,那么就返回Null
          over  可以简单地翻译为在什么的基础之上
          query_partition_clause  分区语句,对结果集合分区的语句,是可选的,如果没有就是所有的一个分区。
          Order_by_clause 排序语句 必须需要 ,形如order by xxx desc/asc     解释示例:
         SQL> select * from test_value;
           
                  MONS JJR               CJL       CJJE
            ---------- ---------- ---------- ----------
                200801 LZF               250       1999
                200802 LZF               200       2000
                200803 LZF               300       1000
                200804 LZF                23        189
                200805 LZF               356        456
                200806 LZF               100        200
                200807 LZF               600        700
                200808 LZF                23        123
                200809 LZF               400        500
           
            9 rows selected
           
            SQL>
            SQL> select rownum 序号,Mons,cjl cjl_01,
              2  lead(cjl,1) over (order by mons desc) cjl_02,
              3  lead(cjl,2) over (order by mons desc) cjl_03,
              4  lead(cjl,3) over (order by mons desc) cjl_04,
              5  lead(cjl,4) over (order by mons desc) cjl_05,
              6  lead(cjl,5) over (order by mons desc) cjl_06,
              7  lead(cjl,6) over (order by mons desc) cjl_07,
              8  lead(cjl,7) over (order by mons desc) cjl_08,
              9  lead(cjl,8) over (order by mons desc) cjl_09
             10   from test_value              序号       MONS     CJL_01     CJL_02     CJL_03     CJL_04     CJL_05     CJL_06     CJL_07     CJL_08     CJL_09
            ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
                     9     200809        400         23        600        100        356         23        300        200        250
                     8     200808         23        600        100        356         23        300        200        250
                     7     200807        600        100        356         23        300        200        250           
                     6     200806        100        356         23        300        200        250                      
                     5     200805        356         23        300        200        250                                 
                     4     200804         23        300        200        250                                            
                     3     200803        300        200        250                                                       
                     2     200802        200        250                                                                  
                     1     200801        250                    实践使用示例:            select id,lead(id,1)over(partition by  call_req_id order by call_req_id ,id),type,analyst,time_stamp from act_log order by call_req_id ,id
      

  5.   

    本帖最后由 c_hua6280 于 2011-02-24 09:53:43 编辑
      

  6.   

    而这个表中才7条数据阿 用上面的SQL 查询之后便成了 10条了。20090817 20091001
    20090817 20091001
    20090817 20091001
    20091001 20091123
    20091001 20091123
    20091122 20091125
    20091123 20091124
      

  7.   

    SELECT B01.EFCT_BEG_DT,
                    B01.EFCT_END_DT,
                    LEAD(B01.EFCT_BEG_DT, 1) OVER(PARTITION BY B01.MODEL_Y_CD ORDER BY B01.MODEL_Y_CD) EFCT
      FROM I_BOM01 B01, W_SHIP_PLN_RECOM WSPR
     WHERE B01.XXX = WSPR.XXX --这两个表不能没有关联条件把
     GROUP BY B01.MODEL_Y_CD
      

  8.   

    选出所有有重叠部分的记录。select *
    from w1 a
    where exists (select 1
    from w1
    where EFCT_END_DT>a.EFCT_BEG_DT
    and EFCT_BEG_DT<a.EFCT_END_DT
    and rowid != a.rowid
    );
    SQL> select * from w1;EFCT_BEG_DT EFCT_END_DT
    ----------- -----------
       20090101    20090104
       20090105    20090115
       20090114    20090130SQL>
    SQL> select *
      2  from w1 a
      3  where exists (select 1
      4     from w1
      5     where EFCT_END_DT>a.EFCT_BEG_DT
      6     and EFCT_BEG_DT<a.EFCT_END_DT
      7     and rowid != a.rowid
      8  );EFCT_BEG_DT EFCT_END_DT
    ----------- -----------
       20090105    20090115
       20090114    20090130SQL>
      

  9.   

    你把 你的SQL发上来,就是没有加判断合法不合法之前的 我在你的SQL基础上帮你改下~ 
    因为 over的partition by 要和你右面的 group by 一样 我不好写 
      

  10.   

    本帖最后由 c_hua6280 于 2011-02-24 09:54:00 编辑