Sql 如何基于日期返回最后两个值

Sql 如何基于日期返回最后两个值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要根据交易日期获得以下数据集的结果。示例员工为FTE 1.0,但更改为FTE 0.9。我该怎么做 with HrHist as ( select *, row_number() over (partition by h.EMPLOYEE order by h.EMPLOYEE, h.BEG_DATE desc) as rownum from dbo.HRHISTORY h where h.FLD_NBR = 56 and h.EMPLOYEE = 123 ) select HrHist.

我需要根据交易日期获得以下数据集的结果。示例员工为FTE 1.0,但更改为FTE 0.9。我该怎么做

with 
HrHist as
(
select *, row_number() over (partition by h.EMPLOYEE order by h.EMPLOYEE, h.BEG_DATE desc) as rownum
from dbo.HRHISTORY h
where h.FLD_NBR = 56 and h.EMPLOYEE = 123

)
select HrHist.EMPLOYEE, 
format(max(HrHst.N_VALUE), '#.00') as currFTE, 
format(min(HrHist.N_VALUE), '#.00') as prevFTE
from HrHist
where rownum <= 2
group by HrHist.EMPLOYEE
结果:当前FTE不是1.0。是0.9。我希望0.9为当前版本,1.0为以前版本。行数可以很多,但我只关心最后两行

受雇者 currFTE 普雷夫特 123 1 .90
可能是这样的:

with 
HrHist as
(
select *, row_number() over (partition by h.EMPLOYEE order by h.EMPLOYEE, h.BEG_DATE desc) as rownum
from dbo.HRHISTORY h
where h.FLD_NBR = 56 and h.EMPLOYEE = 123

)
select HrHist.EMPLOYEE, 
format(MAX(CASE WHEN row_nbr = 1 THEN HRHX.N_VALUE END), '#.00') as currFTE, 
format(MAX(CASE WHEN row_nbr = 2 THEN HRHX.N_VALUE END), '#.00') as prevFTE
from HrHist
where rownum <= 2
group by HrHist.EMPLOYEE
我这么说可能是因为你的部分问题与其他问题不一致/你谈论的是不存在的领域

无论如何。。“最大值”和“最小值”不会给出当前值和以前的值,它们会给出“最大值”和“最小值”。如果X的当前值小于上一个值,则MAX将返回上一个值,MIN将返回当前值

相反,我们使用CASE只选择1[current]值或2[prev]值,然后使用一些聚合函数(如MAX)挤压row_nbr为1时产生的空值,然后row_nbr=2时的CASE将返回空值,这样每个员工就可以得到一行


它称为条件聚合,这是一种用于实现数据透视的技术

您编写的FTE包含1.0之类的值,但您的查询既不引用名为FTE的列,也不引用名为FTE的示例数据集。它确实引用了名为N_VALUE的列,该列在示例数据中不存在。您的查询还引用了不存在的别名HRHX。获取帮助和避免所有这些简单错误的最佳方法是提供一个@SMor-I修复了查询以消除输入错误。N_值是FTE。该列包含任何数据,如薪资变动。FLD_NBR与变更内容相对应,在本例中为FTE。FLD_NBR 56反映了FTE的变化。如果查看我的列别名,您会注意到,在本例中,我调用的是N_值fte。谢谢你的关注!您的示例数据中也没有N_值。@Charlieface-编辑问题以添加该值。