如何实现这个逻辑?

时间:2014-09-18 13:17:18

标签: sql sql-server-2008 sql-server-2008-r2

我设计了一个脚本来获取基于不同因素的检查员绩效得分。检查员根据其绩效分数获得成绩。脚本作为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 

1 个答案:

答案 0 :(得分:0)

在应用任何逻辑之前,您可以先识别上一个作业/工作日期。比如,您可以将InspectorID和LastWorkDay存储在临时表中(假设LastWorkDay将在某些表中可用)。然后基于LastWorkDay,您可以决定返回多少天 - 90或180.这将是临时表中的另一个字段(StartDate),可以根据LastWorkDay列派生。