尝试下面的查询报表记录源:
SELECT TestTable.GroupByCol, TestTable.DetailColA
FROM TestTable
WHERE TestTable.DetailColA IN
(SELECT TOP 2 DetailColA FROM TestTable AS TT
WHERE TT.GroupByCol=TestTable.GroupByCol
ORDER BY TT.DetailColA)
ORDER BY TestTable.GroupByCol, TestTable.DetailColA
见艾伦·布朗的Subquery Basics以获取更多信息。
编辑:正如您在您的评论暗示,这也可以写成如下:
SELECT a.GroupByCol, a.DetailColA, COUNT(*) As RankNumber
FROM TestTable AS a INNER JOIN TestTable AS b
ON a.GroupByCol = b.GroupByCol
AND a.DetailColA >= b.DetailColA
GROUP BY a.GroupByCol, a.DetailColA
HAVING COUNT(*)<=2
ORDER BY a.GroupByCol, a.DetailColA, COUNT(*)
你将不得不基准可以肯定的,但是这第二个版本可能是更有效的。哪个更具可读性可能是个人喜好的问题(我发现第一个版本更直观和可读)。
你需要指定一个ORDER BY,否则你的“TOP 2”是没有意义的,因为这可能是随机的。 – Jacob
@cularis。是。现在从mwolfe02的答案中可以明显看出。 thx – Gullu