一个储存信用卡交易记录的表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这里第三条记录就是我要找的了,它的旧余额比上一条记录的新余额要多,所以有欺诈的可能性。
应该是用游标吧?该怎么写呢?谢谢大家
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这里第三条记录就是我要找的了,它的旧余额比上一条记录的新余额要多,所以有欺诈的可能性。
应该是用游标吧?该怎么写呢?谢谢大家
不一定要用游标
试试
select * from(
select t.*,lag(new_value)over(partition by cardid order by tansactionid)lg
from table1 t)
where old_value>lg
呵呵,测试可行,多谢啦
我还有个问题,如果不仅需要把这条记录记录输出,而且还要把它前一条记录输出,以便能清楚的看出卡的余额的变化,该怎么办呢?比如那个例子里面,需要输出第二和第三条。
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))
可以看执行计划比较下效率