SQL查询获得每个帐户的最新活动(有效查询)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询获得每个帐户的最新活动(有效查询)相关的知识,希望对你有一定的参考价值。

我使用MS SQL Server 2016,并尝试高效地查询MS Dynamics 2016内部部署数据库。您不需要有关Dynamics的特殊知识即可回答我的问题,因为它是SQL而非CRM的问题。

假设您有实体FilteredAccounts和FilteredActivities(在Dynamics视图中是名称)

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行)。有没有更好的方法(例如,每当添加/更改活动时触发触发将最近活动id存储在帐户上的脚本的脚本。这会损害CRM系统的完整性吗?您不想更改我想您的CRM的系统数据库是这样吗?

答案

使用正确的索引,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)上。

以上是关于SQL查询获得每个帐户的最新活动(有效查询)的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助优化外连接 SQL 查询

SQL 查询 - 获取每个文档的最新文档版本 URL

使用 Google BigQuery 上的开始/结束日期优化活动帐户查询

桥接表的 SQL 查询帮助

在 SQL 查询中过滤包括帐户 ID 或用户 ID 的安全方法

Django Q 错误查询逻辑