MS SQL Server-如何为每个行项目生成结束日期

MS SQL Server-如何为每个行项目生成结束日期,sql,sql-server,tsql,Sql,Sql Server,Tsql,在表中,我有emp_id、rate_Efficial_date和hourly_rate列,但是没有rate_Efficial_end_date列 请帮助我查询每个行项目的生成率\有效\结束\日期 对于任何给定的员工,费率生效日期将从下一个费率生效日期-1开始计算 Emp id | rate_effective_date | hourly_rate | rate_effective_end_date --------+---------------------+-------------+--

在表中,我有emp_id、rate_Efficial_date和hourly_rate列,但是没有rate_Efficial_end_date列

请帮助我查询每个行项目的生成率\有效\结束\日期

对于任何给定的员工,费率生效日期将从下一个费率生效日期-1开始计算

Emp id  | rate_effective_date | hourly_rate | rate_effective_end_date 
--------+---------------------+-------------+------------------------
1       | 01/01/17            | 50          | 06/29/17
1       | 06/30/17            | 55          | 09/30/17
1       | 10/01/17            | 45          | 12/31/17
1       | 01/01/18            | 60          | {null}

这将返回myTable中的所有字段,如果给定员工的另一条记录的生效日期晚于下一条记录的生效日期,则将返回计算为下一条记录生效日期前1天的生效日期。 如果没有后续记录,则返回的值将为空

; with cte as 
(
    select emp_id
    , rate_effective_date 
    , hourly_rate 
    , row_number() over (partition by emp_id order by rate_effective_date ) r 
    from myTable
)

select a.emp_id
, a.rate_effective_date 
, a.hourly_rate 
, dateadd(day, -1, b.rate_effective_date) rate_effective_end_date 
from cte a
left outer join cte b
on b.emp_id = a.emp_id
and b.r = a.r + 1
将lead函数与dateadd函数一起使用

换句话说,您也可以使用子查询


那么,利率有效期和结束日期是如何计算的呢?在不知道你的数据/逻辑是什么的情况下,我们究竟如何开始回答这个问题呢?请澄清您的问题。阅读以下内容:我的最佳猜测是查找和函数。但是投票结束。
select *, 
       dateadd(day, -1, lead(rate_effective_date) over(partition by Emp_id order by rate_effective_date)) as rate_effective_end_date  
from table t;
select *, 
       dateadd(day, -1, (select top 1 rate_effective_date from table 
                         where emp_id = t.emp_id and 
                         rate_effective_date > t.rate_effective_date 
                         order by rate_effective_date)
               ) as rate_effective_end_date  
from table t;