[英]Top Values in a Query by Group
我知道如何獲得最高價值,但遇到一些非常簡單的問題。
我有一張學生桌。 它具有:
我想要一個查詢或報告,以顯示每個年級單圈最多的前兩個孩子。
MySQL沒有任何排名功能,但是它允許創建和更新變量:
SELECT x.grade,
x.name,
x.numberoflaps
FROM (SELECT s.grade,
s.name,
s.numberoflaps,
CASE
WHEN @grade != s.grade THEN @rownum := 1
ELSE @rownum := @rownum + 1
END AS rank,
@grade := s.grade
FROM STUDENTS s,
(SELECT @rownum := 0, @grade := NULL) r
ORDER BY s.grade, s.numberoflaps DESC) x
WHERE x.rank <= 2
ORDER BY x.grade, x.rank
子查詢中的ORDER BY
很重要,否則排名將無法正確執行。
使用CTE:
WITH laps AS (
SELECT s.grade,
s.name,
s.numberoflaps,
ROW_NUMBER() OVER (PARTITION BY grade ORDER BY numberoflaps DESC) AS rank
FROM STUDENTS s)
SELECT l.grade,
l.name,
l.numberoflaps
FROM laps l
WHERE l.rank <= 2
ORDER BY l.grade, l.numberoflaps DESC
相當於非CTE:
SELECT l.grade,
l.name,
l.numberoflaps
FROM (SELECT s.grade,
s.name,
s.numberoflaps,
ROW_NUMBER() OVER (PARTITION BY grade ORDER BY numberoflaps DESC) AS rank
FROM STUDENTS s) l
WHERE l.rank <= 2
ORDER BY l.grade, l.numberoflaps DESC
Oracle在9i中獲得了排名功能; 對於SQL Server,是2005年。
SQL Server 2005+版本如下所示:
;WITH Laps_CTE AS
(
SELECT
grade, name, numberoflaps,
ROW_NUMBER() OVER (
PARTITION BY grade
ORDER BY numberoflaps DESC
) AS RowNum
FROM students
)
SELECT grade, name, numberoflaps
FROM Laps_CTE
WHERE RowNum <= 2
如果那不是您的方言,請告訴我們是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.