嗨,我有一个存储过程,用于在搜索时获取记录。此过程返回数百万条记录。但是,在搜索过程中发现了一个bug,当满足某些条件时,在某些场景中也会返回重复的记录。我发现了为什么返回重复记录的错误:下面是有问题的查询:
With cteAutoApprove (AcctID, AutoApproved,DecisionDate)
AS (
select
A.AcctID,
CAST(autoEnter AS SMALLINT) AS AutoApproved,
DecisionDate
from
(
SELECT
awt.AcctID,
MIN(awt.dtEnter) AS DecisionDate
FROM
dbo.AccountWorkflowTask awt
JOIN dbo.WorkflowTask wt ON awt.WorkflowTaskID = wt.WorkflowTaskID
Join Task T on T.TaskID = wt.TaskID
WHERE
(
(T.TaskStageID = 3 and awt.ReasonIDExit is NULL)
OR (wt.TaskID IN (9,15,201,208,220,308,319,320,408,420,508,608,620,1470,1608,1620))
)
GROUP BY
awt.AcctID
) A
Join AccountWorkflowTask awt1
on awt1.dtEnter=A.DecisionDate and awt1.AcctID=a.AcctID
), 由于awt1.dtEnter=A.DecisionDate上的条件,此CTE返回重复记录,某些帐户的dtEnter完全相同。这就是它返回重复记录的原因。
我的问题是我应该用什么来防止这种情况。我不能在这里使用Distinct,因为它肯定会减慢搜索过程。我应该使用Rank还是稠密Rank,以便优化它,并且查询执行结果所需的时间更短?还是其他的技巧?请帮帮我,因为我被困在这里了
发布于 2015-07-03 07:16:22
显然,我不能在这里测试这个查询,但在这里,它似乎是一个很好的row_number候选(不是排名,相同的日期在相同的记录上,您仍然有多条记录):
select
A.AcctID,
CAST(autoEnter AS SMALLINT) AS AutoApproved,
DecisionDate
from
(
SELECT
awt.AcctID,
awt.dtEnter AS DecisionDate,
autoEnter,
row_number() over (partition by awt.acctid order by awt.dtEnter) rnr
FROM
dbo.AccountWorkflowTask awt
JOIN dbo.WorkflowTask wt ON awt.WorkflowTaskID = wt.WorkflowTaskID
Join Task T on T.TaskID = wt.TaskID
WHERE
(
(T.TaskStageID = 3 and awt.ReasonIDExit is NULL)
OR (wt.TaskID IN (9,15,201,208,220,308,319,320,408,420,508,608,620,1470,1608,1620))
)
) A
where rnr = 1这样,分组就不再必要了:第一次约会是由row_number完成的。第二个联接也不是,子查询已经包含了所有的数据(优化器足够聪明,不会对它不需要的行做任何事情)
PS。因为sql server窗口函数的工作效率非常高,所以使用row_number而不是min() - join构造,很可能会提高性能,即使没有双行。
https://stackoverflow.com/questions/31200259
复制相似问题