Ho una tabella di esempio come questo:Come selezionare TOP 5 PERCENT da ciascun gruppo?
CREATE TABLE #TEMP(Category VARCHAR(100), Name VARCHAR(100))
INSERT INTO #TEMP VALUES('A', 'John')
INSERT INTO #TEMP VALUES('A', 'John')
INSERT INTO #TEMP VALUES('A', 'John')
INSERT INTO #TEMP VALUES('A', 'John')
INSERT INTO #TEMP VALUES('A', 'John')
INSERT INTO #TEMP VALUES('A', 'John')
INSERT INTO #TEMP VALUES('A', 'Adam')
INSERT INTO #TEMP VALUES('A', 'Adam')
INSERT INTO #TEMP VALUES('A', 'Adam')
INSERT INTO #TEMP VALUES('A', 'Adam')
INSERT INTO #TEMP VALUES('A', 'Lisa')
INSERT INTO #TEMP VALUES('A', 'Lisa')
INSERT INTO #TEMP VALUES('A', 'Bucky')
INSERT INTO #TEMP VALUES('B', 'Lily')
INSERT INTO #TEMP VALUES('B', 'Lily')
INSERT INTO #TEMP VALUES('B', 'Lily')
INSERT INTO #TEMP VALUES('B', 'Lily')
INSERT INTO #TEMP VALUES('B', 'Lily')
INSERT INTO #TEMP VALUES('B', 'Tom')
INSERT INTO #TEMP VALUES('B', 'Tom')
INSERT INTO #TEMP VALUES('B', 'Tom')
INSERT INTO #TEMP VALUES('B', 'Tom')
INSERT INTO #TEMP VALUES('B', 'Ross')
INSERT INTO #TEMP VALUES('B', 'Ross')
INSERT INTO #TEMP VALUES('B', 'Ross')
SELECT Category, Name, COUNT(Name) Total
FROM #TEMP
GROUP BY Category, Name
ORDER BY Category, Total DESC
DROP TABLE #TEMP
mi dà il seguente:
A John 6
A Adam 4
A Lisa 2
A Bucky 1
B Lily 5
B Tom 4
B Ross 3
Ora, come faccio a selezionare i TOP 5 PERCENT
record da ogni categoria assumendo ogni categoria ha più di 100 record (non mostrato nella tabella di esempio qui)? Per esempio, nella mia tabella effettiva, si deve rimuovere il record John
da A
e Lily
registrare da B
a seconda dei casi (ancora una volta, non ho vedere la tabella completa qui) per ottenere:
A Adam 4
A Lisa 2
A Bucky 1
B Tom 4
B Ross 3
ho cercato di utilizzare le clausole CTE
e PARTITION BY
ma non riesco a ottenere ciò che voglio. Rimuove il 5 PERCENT TOP dal risultato complessivo ma non da ogni categoria. Eventuali suggerimenti?
Può aiutare in un modo piccolo - Se si dispone di un conteggio per un gruppo, ricordare che il 5 percento sarebbe "row_num <= (5 * count)/100" –
@KierenJohnstone: +1 Grazie. So che potrei dover usare CROSS APPLY o qualcosa di simile ma ho ancora qualche problema. Aggiornerà se lo capisco. – Legend
Qual è l'uscita desiderata quindi per favore? Rimuovi il 5% superiore superiore è molto piccolo rispetto al conteggio di 6. Una riga (A, John) è il 16%. – gbn