0

我正在使用 SQL Developer for Oracle 11g ..

我需要能够遍历一组日期,检查上面或下面的 END_DATE 是否比下一个 END_DATE 为 = 或 < 或 > 并且 START_DATE 不同..

然后分配一个与其 = 相同的行程编号或分配一个新的行程编号,然后开始新的行程并再次检查下一组日期以查看其 = 或 < 或 > 是否比当前日期..

我认为为了做到这一点,我需要使用 pl/sql 游标进行循环。我试图弄清楚,但它对我来说没有多大意义。

例如,我希望最终结果是这样的..

ROWID   START_DATE END_DATE   TRIP
  1         30-DEC-11  1-Jan-12 1
  2         31-DEC-11  2-Jan-12 2
  3         31-DEC-11  2-Jan-12 2
  4         01-JAN-12  3-Jan-12 3
  5         03-JAN-12  4-Jan-12 4
  6         01-JAN-12  1-Jan-12 5
  7         02-JAN-12  4-Jan-12 6

在此先感谢您的帮助。亚历克斯

4

1 回答 1

1

根据您拥有的数据,您只需枚举日期对。你也可以用 dense_rank() 来做到这一点:

select t.*,
       dense_rank() over (order by start_date, end_date) as trip
from t

对于您的数据,这将更改排序。如果你想保持大致相同的顺序,那么首先聚合,获取最小行 id,然后执行 dense_rank() 或 row_number(),然后重新加入原始数据:

select t.*, trip
from (select start_date, end_date, row_number() over (partition by row_id) as trip
      from (select start_date, end_date, min(rowid) as rowid
            from t
            group by start_date, end_date
           ) a
     ) b join
     t
     on b.start_date = t.start_date and b.end_date = t.end_date
于 2012-08-27T16:33:24.877 回答