我在SQLFiddle中定义了以下表和行

我需要从产品表中选择两行start_datenvl(return_date,end_date)为1,即当前行的start_date和上一行的nvl(return_date,end_date)应该为1

例如
PRODUCT_NO TSH098PRODUCT_REG_NO FLDGEND_DATE,2012年8月15日PRODUCT_NO TSH128PRODUCT_REG_NO FLDG start_date,2012年8月16日,所以区别只是一天。

如何使用sql获取所需的输出。

任何帮助都是非常明显的。

谢谢

最佳答案

您可以使用 lag 分析函数来访问当前位置之前给定物理偏移量的行。根据您的排序顺序,它可能看起来像这样(虽然不太优雅)。

select *
  from products p
  join (select *
         from(select p.Product_no
                   , p.Product_Reg_No
                   , case
                       when (lag(start_date, 1, start_date) over(order by product_reg_no)-
                            nvl(return_date, end_date)) = 1
                            then lag(start_date, 1, start_date)
                                   over(order by product_reg_no)
                        end start_date
                   , End_Date
                   , Return_Date
               from products p
              order by 2,1 desc
              )
        where start_date is not null
       ) s
    on (p.start_date = s.start_date or p.end_date = s.end_date)
 order by 2, 1 desc

SQL FIddle DEMO

10-06 16:20