SQL 查询获取每个帐户的最新活动(高效查询)
SQL Query get most recent activiy per account (efficient query)
我使用 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)
我想要实现的是所有帐户的列表,它向每个帐户显示最近完成的 activity。
我试图通过以下方式获取最近的活动:
SELECT TOP 1 *
FROM [dbo].[FilteredActivityPointer] As Activities
ORDER BY Activities.actualend DESC
现在我如何有效地加入 FilteredAccounts 和 FilteredActivities,以便每个 FilteredAccount 行我只获得最新的 FilteredActivity?我计算最近活动的方式是执行此操作的有效方法吗(即数据库中存储的活动 > 1.000.000 行)。有没有更好的方法来做到这一点(比如每当添加/更改 activity 时触发存储帐户上最新 activityid 的 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)
。
我使用 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)
我想要实现的是所有帐户的列表,它向每个帐户显示最近完成的 activity。
我试图通过以下方式获取最近的活动:
SELECT TOP 1 *
FROM [dbo].[FilteredActivityPointer] As Activities
ORDER BY Activities.actualend DESC
现在我如何有效地加入 FilteredAccounts 和 FilteredActivities,以便每个 FilteredAccount 行我只获得最新的 FilteredActivity?我计算最近活动的方式是执行此操作的有效方法吗(即数据库中存储的活动 > 1.000.000 行)。有没有更好的方法来做到这一点(比如每当添加/更改 activity 时触发存储帐户上最新 activityid 的 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)
。