我有结算率历史表。我们需要向客户报告结算费率变化,因此我将此期间(月份)的结算费率与上一期间的结算费率进行比较。如果有delta,我会报告。在例程结束时,我记录了下个月的当前比率。它工作正常,但有一个挑战......
如果员工Tom Thumb本月为有问题的客户工作,但上个月没有工作,则无需进行比较。或者,如果汤姆本月加班,但上个月只有直接时间,我没有加班费可供比较。
我正试图找到一种方法,按期间向后走,直到找到有效的> 0比率。
因此,假设我们的结算时间为201403。 汤姆在201403期间的直接时间法案费率为54.04。 他在同一时期的加班费率为81.06。
现在,我看一下201402期的直接时间和加班费率。如果没有delta,我会转到下一位员工。
但是,如果汤姆在201402期间没有ST或OT率怎么办?我需要向后走到201401年,2013年12月等,直到我找到他上一次为这个客户工作的费率。
我读过在数据库上使用循环不是一个好习惯。完成我需要完成的工作的最佳实践是什么?
答案 0 :(得分:1)
您应该可以使用cte,自我加入和排名功能来完成此操作。类似的东西:
with cte as (
select *, row_number() over (partition by employeeid order by periodid) as [rn]
)
select employeeid, curr.billrate, [last].billrate
from cte as [curr]
left join cte as [last]
on curr.employeeid = last.employeeid
and curr.rn = last.rn + 1
你必须跳到这个以适合你的实际表格结构,但这应该让你非常接近。随意添加where子句(即where curr.billrate <> [last].billrate
)