T-SQL - 通过值向后工作,直到我得到零以上的东西

时间:2014-04-14 19:49:23

标签: sql-server tsql

我有结算率历史表。我们需要向客户报告结算费率变化,因此我将此期间(月份)的结算费率与上一期间的结算费率进行比较。如果有delta,我会报告。在例程结束时,我记录了下个月的当前比率。它工作正常,但有一个挑战......

如果员工Tom Thumb本月为有问题的客户工作,但上个月没有工作,则无需进行比较。或者,如果汤姆本月加班,但上个月只有直接时间,我没有加班费可供比较。

我正试图找到一种方法,按期间向后走,直到找到有效的> 0比率。

因此,假设我们的结算时间为201403。 汤姆在201403期间的直接时间法案费率为54​​.04。 他在同一时期的加班费率为81.06。

现在,我看一下201402期的直接时间和加班费率。如果没有delta,我会转到下一位员工。

但是,如果汤姆在201402期间没有ST或OT率怎么办?我需要向后走到201401年,2013年12月等,直到我找到他上一次为这个客户工作的费率。

我读过在数据库上使用循环不是一个好习惯。完成我需要完成的工作的最佳实践是什么?

1 个答案:

答案 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