Sql server 如何引用使用lag定义的当前列?

Sql server 如何引用使用lag定义的当前列?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有这样一个工资表: declare @t table (OrderedID int, EmpID int, EffDate date, Salary money) insert into @t values (1,1234,'20150101',100) ,(2,1234,'20160101',100) ,(3,1234,'20170101',100) ,(4,1234,'20180101',300) ,(1,2351,'20150101',100) 我正在尝试获取每行的初始生效日期: 前

我有这样一个工资表:

declare @t table (OrderedID int, EmpID int, EffDate date, Salary money)

insert into @t
values
(1,1234,'20150101',100)
,(2,1234,'20160101',100)
,(3,1234,'20170101',100)
,(4,1234,'20180101',300)
,(1,2351,'20150101',100)
我正在尝试获取每行的初始生效日期:

前三行为2015年1月1日

第四排于2018年1月1日有新价值

下面是我用一个案例和一个滞后来尝试的,但我不知道如何引用我正在创建的列的先前值

case when OrderedID = 1 then EFFDaTe
          when Salary != LAG(Salary,1) then EFFDaTe
          else lag(SalaryEFFDT,1) over (order by 1)
end as SalaryEFFDT

谢谢您的帮助。

由于您没有提供预期的输出,我想这就是您想要的:

declare @t table (OrderedID int, EmpID int, EffDate date, Salary money)

insert into @t
values
(1,1234,'20150101',100)
,(2,1234,'20160101',100)
,(3,1234,'20170101',100)
,(4,1234,'20180101',300)
,(1,2351,'20150101',100)
,(5,1234,'20190101',100)

;with cte as
(Select *, OrderedId - Row_Number() over (partition by EmpId,Salary order by OrderedID) as grp
from @t)
, cte1 as
(Select EmpID, grp, min(effDate) as effDate from cte c group by EmpID, grp)
Select OrderedID, t.EmpID, t.EffDate, t.Salary, c.effDate as computeddate 
from cte t join cte1 c on t.EmpID = c.EmpID and t.grp = c.grp
order by OrderedID

那么,您正在尝试获取每个EmpID的第一个生效日期?下面的代码应该可以做到这一点。如果这不是你想要的输出,你能把输出应该是什么样子吗

declare @t table (OrderedID int, EmpID int, EffDate date, Salary money)

insert into @t
values
(1,1234,'20150101',100)
,(2,1234,'20160101',100)
,(3,1234,'20170101',100)
,(4,1234,'20180101',300)
,(1,2351,'20140101',100)
,(2,2351,'20150101',100)


Select
T.*,FE.FirstEff
From @t T
inner join (Select EmpID,MIN(EffDate) as FirstEff from @t group by 
第二组是如果你需要他们第一次拿到薪水,但是如果有人先加薪后降职,你就会遇到问题

Select
T.*,FE.FirstEff
From @t T
inner join (Select EmpID,Salary,MIN(EffDate) as FirstEff from @t group by EmpID,Salary) FE on FE.EmpID = T.EmpID
    and FE.Salary = T.Salary

您想要的输出是什么?Lag不适合此用途,因为它只“向后”查看一行。您需要使用一个子查询,如
从@t as t选择MIN(EffDate),其中t.OrderId=@t.OrderId和t.Salary=@t.Salary。
。请注意,如果一个人的薪资发生变化,然后又变回以前的薪资值,则此操作不起作用。这是正确的。我想我对预期的结果很清楚。这是我额外提供的一列源数据。