【问题标题】:Select records based on Id and most updated record of the same Id根据 Id 和同一 Id 的最新记录选择记录
【发布时间】:2021-05-31 10:21:32
【问题描述】:

我有一张桌子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的旧版本

我怎样才能做到这一点?

【问题讨论】:

标签: sql sql-server stored-procedures


【解决方案1】:

我喜欢在这里使用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);

【讨论】:

  • 我知道你喜欢它,但与 WHERE rn = 1 相比效率低,因为它需要排序
【解决方案2】:

可能更容易使用:

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

来自应用程序

其中申请人 ID = 789

按 ApplicationNum、ApplicantId、ApplicantName 分组

【讨论】:

    【解决方案3】:

    通常最高效的传统方式是使用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
    

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2013-05-29
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      相关资源
      最近更新 更多