SQL:如何在选择多个记录时仅选择最新记录
因此,我想将这个“返回”的结果集转换为它下面的结果集,创建日期是最年轻(最新)的,表示最近添加的内容SQL:如何在选择多个记录时仅选择最新记录,sql,sql-server,Sql,Sql Server,因此,我想将这个“返回”的结果集转换为它下面的结果集,创建日期是最年轻(最新)的,表示最近添加的内容 PhoneNum sourcetable FullName reference Task CreatedDate 0 This is not important Mr john smith 39161 This is different every
PhoneNum sourcetable FullName reference Task CreatedDate
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 16/03/2015 15:01:05
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 12/03/2015 16:58:22
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 12/03/2015 16:58:25
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 10/03/2015 12:29:50
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 12/03/2015 14:18:47
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 10/03/2015 12:40:21
1 This is not important Mr wilson smith 39158 This is different every time, but has been renamed 10/03/2015 12:07:14
1 This is not important Mr wilson smith 39158 This is different every time, but has been renamed 10/03/2015 12:07:14
1 This is not important Mr wilson smith 39158 This is different every time, but has been renamed 10/03/2015 12:07:13
我需要返回的内容:
PhoneNum sourcetable FullName reference Task CreatedDate
0 This is not important Mr john smith 39161 This is different every time, but has been renamed 12/03/2015 16:58:25
1 This is not important Mr wilson smith 39158 This is different every time, but has been renamed 10/03/2015 12:07:14
到目前为止我所拥有的
select distinct d.PhoneNum,d.sourcetable,N.FullName,C.fk_applicationid as ref,t.Subject,t.CreatedDate
from Dial d
join Database.dbo.DM_PhoneNumbers p on p.PhoneNum1 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_PhoneNumbers on p.PhoneNum2 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_ClientApplicants C on C.FK_ClientID = P.FK_ApplicationID
join Database.dbo.DM_Names N on c.FK_ClientID = N.FK_ApplicationID
join Database.dbo.Tasks T on T.FK_ApplicationID = c.FK_ApplicationID
where c.FK_ClientID in (39157,39160)
如有任何帮助,将不胜感激。在末尾添加“order by”以获取订单,并首先添加“desc”
ORDER BY t.CreatedDate DESC
将GROUPBY添加到末尾
在select之后添加“top”,以限制返回的记录数
SELECT TOP 1 ...
好的,再试一次
SELECT
person.PhoneNum,
person.sourcetable,
person.FullName,
person.ref,
t.Subject,t.CreatedDate
FROM Database.dbo.Tasks t
JOIN (
SELECT d.PhoneNum,d.sourcetable,N.FullName,C.fk_applicationid as ref
FROM Dial d
JOIN Database.dbo.DM_PhoneNumbers p on p.PhoneNum1 = d.PhoneNum collate latin1_general_CI_AS
JOIN Database.dbo.DM_PhoneNumbers on p.PhoneNum2 = d.PhoneNum collate latin1_general_CI_AS
JOIN Database.dbo.DM_ClientApplicants C on C.FK_ClientID = P.FK_ApplicationID
JOIN Database.dbo.DM_Names N on c.FK_ClientID = N.FK_ApplicationID
WHERE c.FK_ClientID in (39157,39160)
) person ON T.FK_ApplicationID = person.ref
ORDER BY t.CreatedDate DESC
在这里,我通过“最新优先”选择任务,并加入到每个人都有一个任务的子选定人员中
我没有你的db,希望它能工作或给你正确的方向。你可以使用
ROW\u NUMBER()
:
显然,您只需更改select语句即可获得所需的列。您只需更改我添加的最后一行即可。仅选择每个客户端的最新日期:
select distinct d.PhoneNum,d.sourcetable,N.FullName,C.fk_applicationid as ref,t.Subject,t.CreatedDate
from Dial d
join Database.dbo.DM_PhoneNumbers p on p.PhoneNum1 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_PhoneNumbers on p.PhoneNum2 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_ClientApplicants C on C.FK_ClientID = P.FK_ApplicationID
join Database.dbo.DM_Names N on c.FK_ClientID = N.FK_ApplicationID
join Database.dbo.Tasks T on T.FK_ApplicationID = c.FK_ApplicationID
where c.FK_ClientID in (39157,39160)
AND CreatedDate >= ALL (SELECT DISTINCT MAX(CreatedDate) FROM Tasks WHERE PhoneNum = d.PhoneNum)
这样,您将获得所有客户机,但每个客户机只获得最后添加的一行。请使用rank函数查找旧记录,这是未经测试的!!希望这有帮助
SELECT * FROM (
select distinct d.PhoneNum,d.sourcetable,N.FullName,C.fk_applicationid as ref,t.Subject,t.CreatedDate
, RANK() OVER ( PARTITION BY N.FullName ORDER BY t.CreatedDate DESC ) AS iRank
from Dial d
join Database.dbo.DM_PhoneNumbers p on p.PhoneNum1 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_PhoneNumbers on p.PhoneNum2 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_ClientApplicants C on C.FK_ClientID = P.FK_ApplicationID
join Database.dbo.DM_Names N on c.FK_ClientID = N.FK_ApplicationID
join Database.dbo.Tasks T on T.FK_ApplicationID = c.FK_ApplicationID
where c.FK_ClientID in (39157,39160)
) AS t
WHERE t.iRank = 1
您应该在以下列中使用
groupby
:PhoneNum、FullName、Reference。以及CreatedDate列上的max
函数。然后,内部连接
,将结果连接到您现在的查询。仅供初学者参考。t.CreatedDate desc的订单应该是这样的。您是如何获得phnum 0的日期为12/03/2015 16:58:25
的记录的?您的预期输出与您的要求不符NVM在我的其他评论中,我已删除。我忘了正确滚动。你的问题和标题之间也有点不协调。在标题中,你想要最古老的唱片,但在你的问题中,你想要最新的……如果我试图为约翰·史密斯先生和威尔逊先生牵线搭桥,这行得通吗?或者它只会吸引wilson先生/smith先生?将前1名改为前2名以获得2张记录,但只取决于他们的创建日期我刚刚尝试了这个,因为我担心它不会吸引两个人。啊,你想把他们分组这对他想做的事情不起作用。他不想要createdate订购的最新单记录,他想要的是每个电话号码的最新创建记录。这是正确的方法,但需要稍微修改以适合他的表/列/联接/等。考虑到你有4张向上投票,这个答案似乎对其他人有效,但对我有效,答案高于你的答案,谢谢你的帮助。答案基本相同,但他做了你的工作:)。很乐意帮忙。这是一个总体上更好的答案。
SELECT * FROM (
select distinct d.PhoneNum,d.sourcetable,N.FullName,C.fk_applicationid as ref,t.Subject,t.CreatedDate
, RANK() OVER ( PARTITION BY N.FullName ORDER BY t.CreatedDate DESC ) AS iRank
from Dial d
join Database.dbo.DM_PhoneNumbers p on p.PhoneNum1 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_PhoneNumbers on p.PhoneNum2 = d.PhoneNum collate latin1_general_CI_AS
join Database.dbo.DM_ClientApplicants C on C.FK_ClientID = P.FK_ApplicationID
join Database.dbo.DM_Names N on c.FK_ClientID = N.FK_ApplicationID
join Database.dbo.Tasks T on T.FK_ApplicationID = c.FK_ApplicationID
where c.FK_ClientID in (39157,39160)
) AS t
WHERE t.iRank = 1