仅选择具有最新日期的行

时间:2013-08-22 10:33:57

标签: sql sql-server tsql

我正在尝试编写查询以获取具有最新日期的联系人姓名。 我有一个表,每个联系人有多个结果,但有不同的日期,我正在尝试获得该联系人的最新结果。

4 个答案:

答案 0 :(得分:5)

ranking function ROW_NUMBER()PARTITION BYORDER BY Date DESC一起使用:

WITH CTE
AS
(
   SELECT *,
     ROW_NUMBER() OVER(PARTITION BY contactId
                       ORDER BY date DESC) AS RN
   FROM tablename
)
SELECT *
FROM CTE
WHERE RN = 1;

这将只为您提供每个联系人的最新日期行。

答案 1 :(得分:0)

试试这个:

SELECT *
FROM contacts c1
WHERE NOT EXISTS(
    SELECT 'NEXT'
    FROM contacts c2
    WHERE c1.fk_parent = c2.fk_parent
    AND c2.date > c1.date)

下次,添加你的表格(包括字段和关系)。

我的样本非常通用,因为我不知道你的结构

我认为,

fk_parent是一个表示外键的字段,其中,两个不同的联系人被链接(例如,该字段可以是客户字段)

答案 2 :(得分:0)

此外,还有......

select id, contactname from contacts c1
where contactdate = (select max(contactdate) from contacts c2 where c2.id=c1.id)

答案 3 :(得分:0)

以下内容将创建一个临时表,其中包含每个联系人的最大日期。将此临时表加入到您的基表可以获得您想要的结果。

     create table #latestContact (lastdate datetime ,contactid int);
     insert into #latestContact (lastdate, contactid)
     select max(createdate)
     ,contactid 
     from ContactTable
     group by contactid;

     select * 
     from contactTable c
     join #latestContact l
     on l.lastdate = c.createdate
     and l.contactid = c.contactid;

我注意到你的表结构是什么样的,但我假设你的联系表有一个主键(联系),还使用了创建日期时间字段(createdate)。

这可能比上面的cte排名示例更好,因为它不会选择不需要的行,然后将它们从最终结果集中过滤掉。但是,我没有查看任何解决方案的查询计划或统计数据 - 这将是查看最佳方法的好方法。

希望这有帮助。