如何有效地为一组值TSQL选择最近的记录?

如何有效地为一组值TSQL选择最近的记录?,tsql,Tsql,我有一组表,每个表都包含相关数据,我需要为源表中的每一行选择最新的记录集。有数以百万计的行,我需要有效地做到这一点,到目前为止,我无法返回一个给定的数字只有最近的日期 例如,给定数字的当前结果为: CampaignName MobileNumber Date Campaign A 12345678910 12/02/2018 14:50:30 Campaign B 12345678910 05/02/2018 11:35:22 只应返回活动A的

我有一组表,每个表都包含相关数据,我需要为源表中的每一行选择最新的记录集。有数以百万计的行,我需要有效地做到这一点,到目前为止,我无法返回一个给定的数字只有最近的日期

例如,给定数字的当前结果为:

CampaignName    MobileNumber    Date

Campaign A      12345678910     12/02/2018 14:50:30
Campaign B      12345678910     05/02/2018 11:35:22
只应返回活动A的行

我实际上是在尝试获取每个手机号码发送的最新消息以及该消息的活动数据(每条消息都是活动的一部分)

SELECT CC.campaignname,
       Co.mobilenumber,
       Max(M.msgcreatetime)
FROM   [Database].[dbo].[messages] M WITH(nolock)
       INNER JOIN dbo.messagecontact MC WITH(nolock)
               ON M.msgid = MC.messageid
       INNER JOIN dbo.campaigncontact Co WITH(nolock)
               ON Co.contactid = MC.contactid
       INNER JOIN dbo.campaign CC WITH(nolock)
               ON M.campaignid = CC.campaignid
GROUP  BY CC.campaignname,
          Co.mobilenumber 
使用和:

top 1与ties一起使用
意味着您将获得order by expression值最低的所有记录。
使用
row_number()(按Co.mobilenumber顺序按M.msgcreatetime desc分区)
将为每个Co.mobilenumber返回1作为最后一个日期,2作为最后一个等的第二个日期

SELECT TOP 1 WITH TIES
       CC.campaignname,
       Co.mobilenumber,
       M.msgcreatetime
FROM   [Database].[dbo].[messages] M WITH(nolock)
       INNER JOIN dbo.messagecontact MC WITH(nolock)
               ON M.msgid = MC.messageid
       INNER JOIN dbo.campaigncontact Co WITH(nolock)
               ON Co.contactid = MC.contactid
       INNER JOIN dbo.campaign CC WITH(nolock)
               ON M.campaignid = CC.campaignid
ORDER BY ROW_NUMBER() OVER(PARTITION BY Co.mobilenumber ORDER BY M.msgcreatetime desc)

你需要提供更多的信息。这个查询有什么问题?挣扎意味着什么?最后,你不应该使用` with(nolock)No table name source。好的,谢谢,我已经更新了@Mazhar的帖子