2017-09-26 3 views
0

Lassen Sie mich das ganze Problem erklären. ich habe Angenommen, eine Tabelle wie untenWie bekomme ich nur 10% Datensätze jeder Gruppe nach Spalte?

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   

Jetzt brauche ich wie 10% Aufzeichnungen jeden „BOXNO“

zum Beispiel BOXNO „77777“ haben 10 Datensätze zu erhalten führen. 10% von 10 Datensätzen sind 1 Datensatz. Daher sollte nur 1 Datensatz sichtbar sein.

in meinem Kopf nur so, es mit Cursor und Temp-Tabelle zu tun. Jeder kann vorschlagen und einfacher Weg, um diese Art von Ergebnis zu bekommen?

+0

Was ist, wenn alle BOXNO haben weniger als 10 Zeilen oder nur 1? –

+0

@Ankit Bajpai in diesem Fall, mindestens 1 Datensatz sollte da sein. –

Antwort

3

Sie können dies mit Fensterfunktionen tun. Obwohl es ntile() und `Perzentil() -Funktionen ist, würde ich tun, nur die Zählungen ausdrücklich:

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; 

Möglicherweise möchten Sie sicherstellen, dass Sie mindestens einen Datensatz erhalten. Wenn ja:

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

Sie können Daten erhalten, indem mit 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 

Ergebnis:

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