2016-12-27 58 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

這很有趣。我正在努力讓它整合 –