2016-12-27 55 views
0

从每个日期的记录,我试图完善审计方法,从上周的收集记录了10%,他们可以进行审核。我目前使用的是CROSS APPLY以获取期间每个办公室10%,但大部分的这些记录是从第2天。为了提高审计我要确保每天范围内的记录都包含在10%。确保TOP(10)%的包括范围

SELECT t1.PIC, t1.TransID, t1.ID, t1.TranCode, t1.Doc, t1.TranDate, t1.Operator, t1.Office 
FROM [dbo].[Office] 
CROSS APPLY 
(
    SELECT TOP (10) PERCENT d2.* 
    FROM ##AUDIT AS d2 
    WHERE d2.Office = [dbo].[Office].CodeValue 
    ORDER BY d2.TransID 
) AS t1 
ORDER BY [dbo].[Office].CodeValue 

这很适合让我从每个办公室中获得10%的收益,但我需要改进它。

+0

是你TransIDs顺序发出?你想随机检索记录,还是根据创建时间记录? – APH

回答

0

不要TransId,这大概是增量分配的次序。相反,使用where得到你想要的日期时间,然后顺序随机:

SELECT . . . 
FROM [dbo].[Office] CROSS APPLY 
    (SELECT TOP (10) PERCENT d2.* 
     FROM ##AUDIT AS d2 
     WHERE d2.Office = [dbo].[Office].CodeValue AND 
      d2.tranDate >= dateadd(day, -7, cast(getdate() as date)) 
     ORDER BY newid() 
    ) t1 
+0

谢谢。据推测,我可以设置日期范围,而不是使用最近7天? –

+1

类似于AND d2.TranDate> = @开始日期 –

+0

@DanielCooke。 。 。是的,您可以将日期范围设置为您喜欢的范围。 –

0

这里的另一种方法,不使用top...percent。伪随机分配(使用newID)的行数,每一个新的transdate重新开始。使用ceiling(tot/10.0)可以获得包含至少10%样本的每个日期的记录数量(例如,如果当天有10个或更少的记录,则为1条记录,如果有11条和20条记录之间有2条记录等),则从您的初始表中选择多条记录。

;with CTE as (
select tranDate, transID 
    , count(transID) over (partition by tranDate) tot 
    , row_number() over (partition by tranDate order by newid()) rn 
from ##Audit) 

select * 
from CTE 
where ceiling(tot/10.0) >= rn 

您可以修改查询的partition by部分,如果你需要从每个办公室中选择10%,每个日期,或其他因素。

+0

这很有趣。我正在努力让它整合 –