2017-09-26 36 views
0

讓我解釋整個問題。 假設我有一個表像圖所示如何按列獲得每組只有10%的記錄?

Id     Box Folder Status 
    -------------------- ------ -------- ---------- 
    493     77777 9995  1   
    494     77777 9996  1   
    494     77777 9996  1   
    494     77777 9996  1   
    494     77777 9996  1   
    494     77777 9996  1 
    494     77777 9996  1 
    494     77777 9996  1  
    494     77777 9996  1  
    494     77777 9996  1  
    497     88888 9999  1   
    498     88888 0000  0  
    498     88888 0000  0  
    498     88888 0000  0  
    498     88888 0000  0  
    495     99999 9997  1   
    496     99999 9998  1   
    496     99999 9998  1   
    497     88888 9999  1   
    498     88888 0000018 0 
    498     88888 0000018 0 
    498     88888 0000018 0   
    499     66666 0000020 1   
    502     66666 1000  1   

現在我需要像導致每個獲得「boxNo」

例如10%的記錄boxno「77777」有10條記錄。 10條記錄的10%是1條記錄。所以只能看到1條記錄。

在我看來,只有這樣才能用光標和臨時表來做到這一點。 任何人都可以建議以更簡單的方式獲得這些結果?

+0

如果什麼任何boxno有不到10行或只有1個? –

+0

@Ankit Bajpai在這種情況下,至少有1條記錄應該在那裏。 –

回答

3

你可以用窗口函數來做到這一點。雖然ntile()和'百分()函數,我只想做計數明確:

select t.* 
from (select t.*, 
      row_number() over (partition by box order by newid()) as seqnum, 
      count(*) over (partition by box) as cnt 
     from t 
    ) t 
where seqnum <= 0.1 * cnt; 

您可能希望確保您獲得至少一個記錄。如果是這樣的:通過使用

where seqnum <= 0.1 * cnt or seqnum = 1 
2

你可以得到的數據TOP PERCENT

DECLARE @Table TABLE (Id INT, Box VARCHAR(10), Folder VARCHAR(10) , Status INT) 
INSERT INTO @Table 
VALUES 
(493,'77777','9995',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(494,'77777','9996',1), 
(497,'88888','9999',1), 
(498,'88888','0000',0), 
(498,'88888','0000',0), 
(498,'88888','0000',0), 
(498,'88888','0000',0), 
(495,'99999','9997',1), 
(496,'99999','9998',1), 
(496,'99999','9998',1), 
(497,'88888','9999',1), 
(498,'88888','0000018',0), 
(498,'88888','0000018',0), 
(498,'88888','0000018',0), 
(499,'66666','0000020',1), 
(502,'66666','1000',1) 

SELECT X.* FROM (SELECT DISTINCT Box FROM @Table) T 
CROSS APPLY (SELECT TOP 10 PERCENT * FROM @Table WHERE Box = T.Box ORDER BY ID) X 

結果:

Id   Box  Folder  Status 
----------- ---------- ---------- ----------- 
499   66666  0000020 1 
493   77777  9995  1 
497   88888  9999  1 
495   99999  9997  1