我有一张桌子 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
的旧版本
我怎样才能做到这一点?
答案 0 :(得分:0)
我喜欢在这里使用 ROW_NUMBER
和 TIES
技巧:
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