我如何获得每个类别的前n个记录

Koo*_*bin 1 mysql sql t-sql sql-server plsql

我在这里根据类别获取记录.

我的表foo有字段[id,name,class].我的记录可以像:

1, ram, 10
2, hari, 9
3, sita, 10
4, gita, 9
5, rita, 5
6, tina, 7
8, nita, 8
9, bita, 5
10,seta, 7
Run Code Online (Sandbox Code Playgroud)

...和更多...

现在我想得到来自不同类的每条记录的结果..即类似的东西

1, ram, 10
2, hari, 9
5, rita, 5
6, tina, 7
8, nita, 8
Run Code Online (Sandbox Code Playgroud)

即按班级排名前1位

OMG*_*ies 6

对于SQL Server 2005+和Oracle 9i +,请使用分析函数:

WITH summary AS (
  SELECT f.id,
         f.name,
         f.class,
         ROW_NUMBER() OVER (PARTITION BY f.class
                                ORDER BY f.name) AS rank
    FROM FOO f)
SELECT s.id,
       s.name,
       s.class
  FROM summary s
 WHERE s.rank = 1
Run Code Online (Sandbox Code Playgroud)

这也使用公用表表达式(CTE),在Oracle中称为子查询因子...

MySQL没有分析功能支持,所以你必须使用:

SELECT x.id,
       x.name,
       x.class
  FROM (SELECT f.id,
               f.name,
               f.class,
               CASE 
                 WHEN @class = f.class THEN @rownum := @rownum + 1 
                 ELSE @rownum := 1
               END AS rank,
               @class := f.class
          FROM FOO f
          JOIN (SELECT @rownum := 0, @class := '') r
      ORDER BY f.class, f.name) x
 WHERE x.rank = 1
Run Code Online (Sandbox Code Playgroud)