我正在尝试编写查询以获取具有最新日期的联系人姓名。 我有一个表,每个联系人有多个结果,但有不同的日期,我正在尝试获得该联系人的最新结果。
答案 0 :(得分:5)
将ranking function ROW_NUMBER()
与PARTITION BY
和ORDER 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排名示例更好,因为它不会选择不需要的行,然后将它们从最终结果集中过滤掉。但是,我没有查看任何解决方案的查询计划或统计数据 - 这将是查看最佳方法的好方法。
希望这有帮助。