在使用Oracle Rank功能时遇到问题

时间:2014-01-09 17:59:08

标签: oracle

我的表格call_detail包含以下列phone_nocall_idcall_date。我想创建一个视图,其中包含每一行和每条记录的上一次调用。我怎样才能做到这一点?

我尝试在表call_detail上使用自我加入排名,但这只给出了表格中的最新记录。

1 个答案:

答案 0 :(得分:1)

我不确定你在lag()做了什么,但听起来不对。这听起来就像你正在追求的那样; from the documentation

  

LAG是一个分析函数。它可以在没有自联接的情况下同时访问表的多个行。

您需要为每个电话号码拨打上一个电话号码,因此您需要按phone_no进行分区,然后按call_date排序。这显示了所有三个字段的先前值:

select phone_no, call_id, call_date,
  lag(phone_no) over (partition by phone_no order by call_date)
    as prev_phone_no,
  lag(call_id) over (partition by phone_no order by call_date)
    as prev_call_id,
  lag(call_date) over (partition by phone_no order by call_date)
    as prev_call_date
from call_detail
order by call_date;

使用您在评论中提供的示例数据,可以得到:

PHONE_NO          CALL_ID CALL_DATE           PREV_PHONE_NO  PREV_CALL_ID PREV_CALL_DATE    
-------------- ---------- ------------------- -------------- ------------ -------------------
234534534               4 2013-01-11 20:11:03                                                 
234534534               6 2013-01-11 20:11:03 234534534                 4 2013-01-11 20:11:03 
234556777               2 2013-01-11 20:11:03                                                 
234543453               7 2013-01-12 15:11:03                                                 
234543453               5 2013-01-12 16:11:03 234543453                 7 2013-01-12 15:11:03 
234543453               3 2013-01-12 18:11:03 234543453                 5 2013-01-12 16:11:03 
234543453               1 2013-01-12 20:11:03 234543453                 3 2013-01-12 18:11:03 

SQL Fiddle

您可以使用它来创建视图(没有order by子句,并且只使用您想要的列。)