簡體   English   中英

按組查詢的最高值

[英]Top Values in a Query by Group

我知道如何獲得最高價值,但遇到一些非常簡單的問題。

我有一張學生桌。 它具有:

  • 名稱
  • 圈數
  • 年級

我想要一個查詢或報告,以顯示每個年級單圈最多的前兩個孩子。

使用MySQL:


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很重要,否則排名將無法正確執行。

使用Oracle 9i + / SQL Server 2005+:


使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM