我有这样一个示例表:如何从每组中选择TOP 5 PERCENT?
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
给了我下面的:
A John 6
A Adam 4
A Lisa 2
A Bucky 1
B Lily 5
B Tom 4
B Ross 3
现在,如何从每个类别假设每个类别选择TOP 5 PERCENT
记录有100多条记录(这里没有在样品表中显示)?举例来说,在我实际的表,它应该(再次,我在这里没有显示完整的表)中删除从A
的John
记录和Lily
记录从B
酌情获得:
A Adam 4
A Lisa 2
A Bucky 1
B Tom 4
B Ross 3
我一直在努力使用CTE
s和PARTITION BY
子句,但似乎无法实现我想要的。它从整体结果中排除TOP 5 PERCENT,但不是从每个类别中排除。有什么建议么?
可能对你有帮助 - 如果你有一个组的计数,请记住5%将是“row_num <=(5 * count)/ 100” –
@KierenJohnstone:+1谢谢。我知道我可能不得不使用CROSS APPLY或类似的东西,但仍然有一些麻烦。如果我知道它会更新。 – Legend
请问您需要输出什么?删除前5%的比例与6的比例非常小。一行(A,John)为16%。 – gbn