【发布时间】:2011-11-26 15:39:39
【问题描述】:
我有一个这样的示例表:
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 记录和从B 中删除Lily 记录(同样,我没有在此处显示完整表)以获得:
A Adam 4
A Lisa 2
A Bucky 1
B Tom 4
B Ross 3
我一直在尝试使用CTEs 和PARTITION BY 子句,但似乎无法达到我想要的效果。它从整体结果中删除了 TOP 5 PERCENT,但不是从每个类别中删除。有什么建议吗?
【问题讨论】:
-
可能会有所帮助 - 如果您有一个组的计数,请记住 5% 将是“row_num
-
@KierenJohnstone:+1 谢谢。我知道我可能不得不使用 CROSS APPLY 或类似的东西,但仍然遇到一些麻烦。如果我弄明白了会更新。
-
那么希望的输出是什么?与计数 6 相比,删除前 5% 的百分比非常少。一行(A,John)是 16%。
-
看到这个类似的问题:stackoverflow.com/questions/4373451/…
-
@Legend - 我仍然不清楚你想要什么。请给出期望的结果并解释它们是如何得出的。不确定您希望在什么时候应用
TOP 5%。
标签: sql sql-server tsql sql-server-2008 greatest-n-per-group