【问题标题】:How do I efficiently select the most recent record for a set of values TSQL?如何有效地选择一组值 SQL 的最新记录?
【发布时间】:2018-10-12 05:49:03
【问题描述】:

我有一组表,每个表都包含相关数据,我需要为源表中的每一行选择最近的一组记录。有数百万行,我需要有效地执行此操作,到目前为止,我无法仅返回给定数字的最近日期。

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

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 

【问题讨论】:

  • 您需要提供更多信息。该查询有什么问题?挣扎是什么意思?最后,你不应该使用 `with (nolock) brentozar.com/archive/2015/03/…
  • 没有表名为源。
  • 好的,谢谢我已经更新了@Mazhar 的帖子

标签: tsql


【解决方案1】:

使用top 1 with ties 和order by row_number:

使用top 1 with ties 表示将获取order by 表达式的值最低的所有记录。
使用 row_number() over(partition by Co.mobilenumber order by M.msgcreatetime desc) 将返回 1 表示每个 Co.mobilenumber 的最后一个日期,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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-28
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2012-03-19
    • 2016-07-15
    • 2019-07-13
    相关资源
    最近更新 更多