我正在尝试编写查询以获取具有最新日期的联系人姓名。我有一张表格,每个联系人都有多个结果,但日期不同,我正在尝试获取该联系人的最新结果。
问问题
82 次
4 回答
5
将排名函数 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;
这将只为您提供每个联系人的最新日期行。
于 2013-08-22T10:41:35.457 回答
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 是一个表示外键的字段,其中链接了两个不同的联系人(例如,该字段可以是客户字段)
于 2013-08-22T10:37:02.547 回答
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;
我注意到你的表结构是什么样子的,但我假设你的联系人表有一个主键(contacted),并且还使用了一个创建日期时间字段(createdate)。
这可能比上面的 cte 排名示例更好,因为它不会选择不需要的行,然后将它们从最终结果集中过滤掉。但是,我还没有查看任何一种解决方案的查询计划或统计信息——这将是了解哪种方法最有效的好方法。
希望这可以帮助。
于 2013-08-22T19:27:59.683 回答
0
还有,像...
select id, contactname from contacts c1
where contactdate = (select max(contactdate) from contacts c2 where c2.id=c1.id)
于 2013-08-22T11:11:15.680 回答