我只是想知道,以下两个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
的记录对于每个人。您可能会发现以下内容很有用:
关于sql - 选择每个人的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5387903/