Sql server 如何基于非主键的列选择行

Sql server 如何基于非主键的列选择行,sql-server,select,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 co

我有一个表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和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

有什么想法吗?

你可以在这上面使用
排名功能

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

您可以在该页面上使用
排名功能

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

这是为了确定你的要求。据我所知,您只希望返回来自单个源的记录?你能澄清一下吗?我不关心结果表中的来源是什么,s1或s2都可以。这是为了确定你在问什么。据我所知,您只希望返回来自单个源的记录?你能澄清一下吗?我不在乎结果表中的来源是什么,s1或s2都可以。好好工作,谢谢。好好工作,谢谢。