sql - 选择每个人的最新记录

标签 sql oracle greatest-n-per-group

我只是想知道,以下两个sql语句是否有任何性能差异或者它们本质上是相同的:

spouse 中选择一个人的最新配偶记录表(person_id、配偶_id、marriage_date)。

select *
from spouse 
where (person_id, marriage_date) in ( select person_id, max(marriage_date) 
                                      from spouse  
                                      group by person_id
                                     )
select *
from spouse s1
where marriage_date = ( select max(marriage_date) 
                        from spouse s2  
                        where s1.person_id = s2.person_id  
                      )

这是报告的常见要求,例如,员工的最新工作、最高学历等。我想知道您是否更喜欢上述陈述的一种方式以及原因,或者,是否有其他更好的方式(在性能/可读性方面)来解决这些获得最新/最高要求的问题。

最佳答案

正如在之前的答案中已经提到的,您可以使用 SQL server windowing functions很好地实现这一点。

SELECT s1.person_id, s1.marriage_date
FROM spouse s1
JOIN ( 
    SELECT 
        person_id, 
        ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY marriage_date DESC) AS Priority
        FROM spouse
    ) s2
ON s2.person_id = s1.person_id AND s2.Priority = 1

在连接查询中,我们按 person_id 对数据进行分区。 ,然后应用排名函数 ( ROW_NUMBER() ) 为每行分配一个数字,按 marriage_date 的降序排列.每个person_id独立进行排名,所以加入条件 s2.Priority = 1意味着我们只得到最大值 marriage_date 的记录对于每个人。

您可能会发现以下内容很有用:
  • OVER clause
  • ROW_NUMBER()
  • Windowing functions
  • 关于sql - 选择每个人的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5387903/

    相关文章:

    php - MySQL & PHP - 选择 6 行,每行有不同的 'WHERE' 子句

    sql - 查找所有组合

    c# - 数据集的插入/删除/修改的正确顺序是什么?

    sql - 如何调试 postgresql TRUNCATE 时间的差异?

    SQL 连接和输出格式

    sql - Oracle 11g - FOR 循环仅将工作日插入表中?

    sql - 如何在 SQL 中返回每个组的增量组号

    oracle - ORA-64451 : Conversion of special character to escaped character failed

    sql - 获取列表中每个 ID 的前 3 行

    MYSQL - 根据某个字段返回最近5行