根据 Id 和同一 Id 的最新记录选择记录

时间:2021-05-31 10:21:32

标签: sql sql-server stored-procedures

我有一张桌子 Applications

用户可以提交多个申请。用户也可以更新现有的应用程序,但不是更新记录本身,我们将插入具有相同 ApplicationNumber

的新记录
Id  ApplicationNum    ApplicantId     ApplicantName  CreateDate

1    101              789              John          May-20-2021
2    101              789              John          May-21-2021
3    102              789              John          May-22-2021
4    103              123              Maria         May-31-2021

我想返回基于 ApplicantId 的应用程序列表,但我不想显示相同 ApplicationNumber 的两条记录

如果我使用这个选择语句

Select * from Applications where ApplicantId = 789

这是我目前得到的结果

1    101              789              John          May-20-2021
2    101              789              John          May-21-2021
3    102              789              John          May-22-2021

这是我想要得到的结果

2    101              789              John          May-21-2021
3    102              789              John          May-22-2021

请注意,记录 Id = 1 未显示,因为它是记录 Id = 2 的旧版本

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

我喜欢在这里使用 ROW_NUMBERTIES 技巧:

SELECT TOP 1 WITH TIES *
FROM Applications
WHERE ApplicantId = 789
ORDER BY ROW_NUMBER() OVER (PARTITION BY ApplicantId, ApplicationNum ORDER BY Id DESC);

答案 1 :(得分:0)

可能更容易使用:

选择 max(Id) 作为 Id、ApplicationNum、ApplicantId、ApplicantName、max(CreateDate) 作为 CreateDate

来自应用程序

其中申请人 ID = 789

按 ApplicationNum、ApplicantId、ApplicantName 分组

答案 2 :(得分:0)

通常效率最高的传统方法是使用 row_number 并从每组申请人中选择所需的行

select Id, ApplicationNum, ApplicantId, ApplicantName, CreateDate
from (
    select *, Row_Number() over(partition by ApplicantId, ApplicationNum order by Id desc) rn
    from Applications
    where ApplicantId=789
)a
where rn=1
相关问题