2017-09-26 35 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