我设计了一个脚本来获取基于不同因素的检查员绩效得分。检查员根据其绩效分数获得成绩。脚本作为SQL工作运行一夜,并更新所有检查员(超过6500个检查员)等级。 我们正在检查最近90天的进展情况,但许多在过去90天内没有工作的检查员正在获得满分。为了避免这种情况,我们决定查看最近90天,如果报告的数量为零,那么该检查员再过90天。
即。如果超过6500名检查员让250说没有工作,那么脚本需要再为这250名检查员返回90天,看看他们是否有任何工作。
这可以很容易地在游标中实现,但我不能使用游标,因为它花了很长时间,如此处所讨论select query in Cursor taking too long
另一种选择是什么?我是否应该编写一个功能,首先检查一个检查员在过去90天内是否有任何工作,如果没有,那么再回去90天。但为了做到这一点,我会需要光标吗?
已添加
我已尝试在@Raj中提到的临时表中设置日期,但这花费了太多时间。这是一个使用游标时花了这么长时间的查询。其他统计数据运行正常,我认为与查询有关。
要求:
访问上传文件(1或2或13)的每位检查员的访问次数
表:
Inspectors: InspectorID
InspectionScope: ScopeID, InspectorID (FK)
Visits: VisitID, VisitDate ScopeID (FK)
VisitsDoc: DocID, DocType, VisitID (FK)
DECLARE
@DateFrom90 date, @DateTo date, @DateFrom180 date, @DateFrom date;
SELECT @DateTo = CAST(GETDATE() AS DATE)
,@DateFrom90 = CAST(GETDATE() - 90 AS DATE)
,@DateFrom180 = CAST(GETDATE() - 180 AS DATE)
DECLARE @Inspectors TABLE (
InspectorID int,
InspectorGrade int,
DateFrom date,
DateTo date
);
insert into @inspectors (
InspectorID ,
InspectorGrade,
DateFrom ,
DateTo
)
select
tmp.InspectorID , tmp.InspectorGrade
,case when tmp.VisitWithReport = 0 then @DateFrom180 else @DateFrom90 end StartDate
,@DateTo EndDate
from
(
select
i.InspectorID , i.InspectorGrade
,VisitWithReport = (select COUNT(v.visitid) from visits v
inner join InspectionScope s on s.ScopeID = v.ScopeID
where v.ReportStandard not in (0,9) and v.VisitType = 1
and v.VisitDate BETWEEN @DateFrom90 and @DateTo
and s.InspectorID = i.InspectorID)
from inspectors i
)tmp;
--select * from @Inspectors
SELECT i.InspectorID , i.InspectorGrade
,TotalVisitsWithAtLeastOneReport = (select COUNT(distinct v.visitID) from Visits v
inner join InspectionScope s on s.ScopeID = v.ScopeID
inner join VisitDocs vd on vd.VisitID = v.VisitID
where vd.DocType IN (1,2,13) and s.InspectorID = i.InspectorID
and v.VisitDate BETWEEN i.DateFrom and i.DateTo
)
from @Inspectors i
答案 0 :(得分:0)
在应用任何逻辑之前,您可以先识别上一个作业/工作日期。比如,您可以将InspectorID和LastWorkDay存储在临时表中(假设LastWorkDay将在某些表中可用)。然后基于LastWorkDay,您可以决定返回多少天 - 90或180.这将是临时表中的另一个字段(StartDate),可以根据LastWorkDay列派生。