一个储存信用卡交易记录的表table1,一个主键,一个卡号的外键,还有3列属性,分别是 信用卡旧的余额,交易金额,卡的新的余额:
transactionID PK,
card ID FK,
old_value,
transaction_amount,
new_value我现在的问题是:需要找出有欺诈可能的那些记录,比如说,对于一张信用卡来说,把它所有的消费记录按照时间排序,一条记录的卡的旧余额不能超过上一条记录的新的余额tansactionID |  cardID | old_value |  amount  | new_value
--------------------------------------------------------
1,             001,    500,       100,    400
2,             001,    400,       50,     350
3,             001,    1000,      300,    700这里第三条记录就是我要找的了,它的旧余额比上一条记录的新余额要多,所以有欺诈的可能性。
应该是用游标吧?该怎么写呢?谢谢大家

解决方案 »

  1.   

    按时间排序,是否等同于按tansactionid排序?
    不一定要用游标
    试试
    select * from(
      select t.*,lag(new_value)over(partition by cardid order by tansactionid)lg
      from table1 t)
    where old_value>lg
      

  2.   

    那你就将order by后面的字段换成交易时间就可以了
      

  3.   

    TO:wildwave
    呵呵,测试可行,多谢啦
    我还有个问题,如果不仅需要把这条记录记录输出,而且还要把它前一条记录输出,以便能清楚的看出卡的余额的变化,该怎么办呢?比如那个例子里面,需要输出第二和第三条。
      

  4.   

    不知道这样query效率怎么样,在这个case里面,实际数据有30万条,即使只查询1个月之内的交易记录,也不会少.不过还是谢谢啦~~~
      

  5.   

    可以用
    select * from( 
      select t.*,lag(new_value)over(partition by cardid order by tansactiondate)lg,
      lead(old_value)over(partition by cardid order by tansactiondate)ld
      from table1 t) 
    where old_value>lg or new_value<ld
    或者
    select * from table1 t
      where exists(select 1 from table1
        where cardid=t.cardid and (tansactiondate>t.tansactiondate and old_value>t.new_value)
          or (tansactiondate<t.tansactiondate and new_id<t.old_value))
    可以看执行计划比较下效率
      

  6.   

    又有一个问题,请问10楼的query的关系代数怎么写呀?
      

  7.   

    用PL投影,SL选择,NJ自然连接这种形式的