Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据表中的日期查找最近的记录_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 根据表中的日期查找最近的记录

Sql server 根据表中的日期查找最近的记录,sql-server,sql-server-2008,Sql Server,Sql Server 2008,不知道如何在不特定于我的数据的情况下将其放在表中-我想根据表中的日期查找每个人的最新值 付款历史记录表 PayHistoryID, EmployeeID, Date, PayRate 1, 1, '2017-01-01', 20000 2, 2, '2017-01-01', 21000 3, 3, '2017-01-01', 22000 4,

不知道如何在不特定于我的数据的情况下将其放在表中-我想根据表中的日期查找每个人的最新值

付款历史记录表

PayHistoryID, EmployeeID,  Date,        PayRate
1,            1,          '2017-01-01', 20000
2,            2,          '2017-01-01', 21000
3,            3,          '2017-01-01', 22000
4,            3,          '2017-05-01', 24000
5,            4,          '2017-01-01', 20000
6,            4,          '2017-06-01', 24000
员工表

EmployeeID, EmployeeName
1,          Bob
2,          Frank
3,          Jess 
4,          Alex
我想带回来

EmployeeID, EmployeeName
1,          20000
2,          21000
3,          24000 
4,          24000
要走的路是:

select
    EmployeeID
    ,PayRate
from
(
    select
        rownum = row_number() over(partition by EmployeeID order by ph.[Date] desc)
        ,e.EmployeeID
        ,PayRate
    from EmployeeTable e
        inner join PayHistoryTable ph on e.EmployeeID = ph.EmployeeID
) x
where rownum = 1
要走的路是:

select
    EmployeeID
    ,PayRate
from
(
    select
        rownum = row_number() over(partition by EmployeeID order by ph.[Date] desc)
        ,e.EmployeeID
        ,PayRate
    from EmployeeTable e
        inner join PayHistoryTable ph on e.EmployeeID = ph.EmployeeID
) x
where rownum = 1

您可以使用行号列出您的行,并仅选择前几行。 这里是一个查询表的示例,希望对您有所帮助

Select EmployeeID,PayRate FROM (
Select ROW_NUMBER() OVER(Partition By e.EmployeeID Order By [DATE] DESC) AS RN,e.EmployeeID,PayRate FROM @employee e
INNER JOIN @payHistory p on p.EmployeeID = e.EmployeeID
) as P
Where RN = 1

您可以使用行号列出您的行,并仅选择前几行。 这里是一个查询表的示例,希望对您有所帮助

Select EmployeeID,PayRate FROM (
Select ROW_NUMBER() OVER(Partition By e.EmployeeID Order By [DATE] DESC) AS RN,e.EmployeeID,PayRate FROM @employee e
INNER JOIN @payHistory p on p.EmployeeID = e.EmployeeID
) as P
Where RN = 1
使用第一个_值:

create table #PayHistory (PayHistoryID int, EmployeeID int, [Date] date, PayRate int)

insert into #PayHistory values(1, 1, '2017-01-01', 20000)
insert into #PayHistory values(2, 2, '2017-01-01', 21000)
insert into #PayHistory values(3, 3, '2017-01-01', 22000)
insert into #PayHistory values(4, 3, '2017-05-01', 24000)
insert into #PayHistory values(5, 4, '2017-01-01', 20000)
insert into #PayHistory values(6, 4, '2017-06-01', 24000)

select distinct EmployeeID, FIRST_VALUE(PayRate) OVER (Partition by EmployeeID order by [date] desc) from #PayHistory
2012年之前版本的等效版本:

select distinct ph.EmployeeID
   , (Select top 1 Payrate from #PayHistory where EmployeeID = ph.EmployeeID ORDER BY [DATE] desc) as [PayRate]
from #PayHistory ph
使用第一个_值:

create table #PayHistory (PayHistoryID int, EmployeeID int, [Date] date, PayRate int)

insert into #PayHistory values(1, 1, '2017-01-01', 20000)
insert into #PayHistory values(2, 2, '2017-01-01', 21000)
insert into #PayHistory values(3, 3, '2017-01-01', 22000)
insert into #PayHistory values(4, 3, '2017-05-01', 24000)
insert into #PayHistory values(5, 4, '2017-01-01', 20000)
insert into #PayHistory values(6, 4, '2017-06-01', 24000)

select distinct EmployeeID, FIRST_VALUE(PayRate) OVER (Partition by EmployeeID order by [date] desc) from #PayHistory
2012年之前版本的等效版本:

select distinct ph.EmployeeID
   , (Select top 1 Payrate from #PayHistory where EmployeeID = ph.EmployeeID ORDER BY [DATE] desc) as [PayRate]
from #PayHistory ph

您应该使用外部应用程序:

SELECT *
FROM Employee E
OUTER APPLY (SELECT TOP 1 PayRate FROM PayHistory PH WHERE PH.EmployeeID = 
E.EmployeeID ORDER BY [date] DESC) T

您应该使用外部应用程序:

SELECT *
FROM Employee E
OUTER APPLY (SELECT TOP 1 PayRate FROM PayHistory PH WHERE PH.EmployeeID = 
E.EmployeeID ORDER BY [date] DESC) T

问题被标记为SQL Server 2008,但我喜欢这个方法。我甚至不知道FIRST_值,但我喜欢它。让我们缩短我所有的程序!:不幸的是,PDidn没有注意到2008标签。我喜欢@Mikado68的早期版本的解决方案。如果我能够升级我们的SQL server,那就太好了!问题被标记为SQL Server 2008,但我喜欢这个方法。我甚至不知道FIRST_值,但我喜欢它。让我们缩短我所有的程序!:不幸的是,PDidn没有注意到2008标签。我喜欢@Mikado68的早期版本的解决方案。如果我能够升级我们的SQL server,那就太好了!如果员工被减薪,这不起作用,工资率会更低,但日期越晚,你是对的,我以为我们需要一秒钟的最高工资率,我编辑了我的答案。如果员工被减薪,工资率会更低,但日期越晚,你是对的,我以为声明是我们需要一秒钟内最高的工资率,我编辑了我的答案。