2017-09-26 4 views
0

Supposons que j'ai une table comme indiqué ci-dessousComment obtenir seulement 10% d'enregistrements de chaque groupe par colonne? Laissez-moi vous expliquer tout le problème.

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   

Maintenant, je dois le résultat comme 10% de dossiers de chaque « boxNo »

par exemple boxno « 77777 » ont 10 enregistrements. 10% de 10 enregistrements sont 1 enregistrement. donc seulement 1 enregistrement devrait être visible. Dans mon esprit seul moyen de le faire avec le curseur et la table de temp.

Tout le monde peut suggérer une façon simple et plus simple d'obtenir ce genre de résultat?

+0

si les boxno ont moins de 10 lignes ou seulement 1? –

+0

@Ankit Bajpai dans ce cas, minimum 1 enregistrement devrait être là. –

Répondre

3

Vous pouvez le faire avec les fonctions de la fenêtre. Bien qu'il y ait ntile() et les fonctions `percentile(), je voudrais juste faire les comptes explicitement:

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; 

Vous pouvez vous assurer que vous obtenez au moins un enregistrement. Si oui:

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

Vous pouvez obtenir des données en utilisant 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 

Résultat:

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