如何根据不是主键的列选择行

时间:2013-03-21 14:47:01

标签: sql-server select

我有一个表t1(id,source,info,contact_date),id和source是主键,例如

id    source    info    contact_date
01   s1             …         2013-3-1
01   s2             …         2013-3-1
01   s3             …         2013-2-28
…

我想写一个查询,结果表就像

id    source    info    contact_date
01   s1             …         2013-3-1

id    source    info    contact_date
01   s2             …         2013-3-1

您可能建议将主键更改为id和contact_date,但我不能,我必须保留原始设计。目前我有以下查询

select 
    t1.id, t1.source, t1.info, t1.contact_date 
from t1 
join
    (select id, max(contact_date) as contact_date 
     from t1 
     group by id) t2 on t1.id = t2.id and t1.contact_date = t2.contact_date

但是结果表在下面并不是我想要的。

id    source    info    contact_date
01   s1             …         2013-3-1
01   s2             …         2013-3-1

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以在此使用Ranking Function

SELECT  id, source, info, contact_date
FROM
        (
            SELECT  id, source, info, contact_date,
                    ROW_NUMBER() OVER 
                    (PARTITION BY ID 
                     ORDER BY contact_date DESC) rn
            FROM    t1 
        ) x
WHERE   rn = 1