【问题标题】:SQL Query get most recent activiy per account (efficient query)SQL 查询获取每个帐户的最新活动(高效查询)
【发布时间】:2020-08-31 08:07:08
【问题描述】:

我使用 MS SQL Server 2016 并尝试有效地查询 MS Dynamics 2016 本地数据库。您不需要有关 Dynamics 的特殊知识来回答我的问题,因为它是一个 SQL 问题,而是一个 CRM 问题。

假设您有实体 FilteredAccounts 和 FilteredActivities(这是动态视图中的名称)

FilteredActivites 具有以下列:

accountid
name

FilteredActivites 具有以下列:

activityid
actualend [DATETIME]
regardingobjectid (referring to account) 
statecode (int meaning 1 = completed)

我想要实现的是所有帐户的列表,该列表向每个帐户显示最近完成的活动。

我试图通过以下方式获取最近的活动:

SELECT TOP 1 * 
FROM [dbo].[FilteredActivityPointer]  As Activities
ORDER BY Activities.actualend DESC

现在如何有效地加入 FilteredAccounts 和 FilteredActivities,以便每个 FilteredAccount 行我只获得最新的 FilteredActivity?我计算最近活动的方式是一种有效的方法吗?(即存储在数据库中的活动 > 1.000.000 行)。是否有更好的方法来执行此操作(例如,每当添加/更改活动时触发脚本,该脚本在帐户上存储最新 activityid 的 id。这会损害 CRM 系统的完整性吗?您不想更改我想你的 crm 的系统数据库是这样的吗?

【问题讨论】:

    标签: sql dynamics-crm sql-server-2016 dynamics-crm-2016


    【解决方案1】:

    使用正确的索引,cross apply 可能是最快的方法:

    select fa.*
    from filteredaccounts fac cross apply
         (select top (1) fa.*
          from FilteredActivites fa
          where fa.regardingobjectid = fac.accountid and fa.statecode = 1
          order by fa.actualend desc
         ) fa;
    

    你想要的索引在FilteredActivites(regardingobjectid, accountid, actualend)

    【讨论】:

    • 这真是太快了!!!!谢谢。仅适用于没有经验的其他人......我需要在选择顶部(1)之后添加一个*。我给了错误的实体名称,它应该是 FilteredAccount 和 FilteredActivityPointer 但那是我的错。很好的解决方案!
    猜你喜欢
    • 2013-07-31
    • 2016-04-04
    • 2021-01-10
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多