SQL选择组的第n个成员

Dón*_*nal 24 mysql group-by

如果我有一个像USER这样的表

class | age
--------------
1       20    
3       56
2       11
1       12
2       20
Run Code Online (Sandbox Code Playgroud)

然后我可以轻松地通过每个班级获得最年轻的用户

select class, min(age)
from   user
group by class;
Run Code Online (Sandbox Code Playgroud)

同样,通过用max替换min,我可以得到最老的.但是我怎样才能获得每个班级中最年轻(或最老)的第10名?顺便说一下,我正在使用MySql v.5.0.

干杯,

Pao*_*ino 21

SELECT a.class,
(
    SELECT b.age 
    FROM users b 
    WHERE b.class = a.class
    ORDER BY age 
    LIMIT 1,1
) as age
FROM users a
GROUP BY a.class
Run Code Online (Sandbox Code Playgroud)

在每堂课中获得第二名最年轻的学生.如果你想要第10个最年轻的,你会这样做LIMIT 9,1,如果你想要第10个最老的,那你就做了ORDER BY age DESC.


Dev*_*hah 11

这里NNth记录oldest

SELECT *
FROM users k
WHERE N = (SELECT
             COUNT( DISTINCT age)
           FROM users u
           WHERE k.age >= u.age
               AND k.class = u.class
           GROUP BY u.class)
Run Code Online (Sandbox Code Playgroud)

它给出了Nth记录youngest

SELECT *
FROM users k
WHERE N = (SELECT
             COUNT(DISTINCT age)
           FROM users u
           WHERE k.age <= u.age
               AND k.class = u.class
           GROUP BY u.class)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ick 5

唯一独立于sql的方式(即使你没有子查询mysql <5)

 select  u1.class, u1.age, count(*)  from      user u1 join user u2 
 on u1.class = u2.class and u1.age >= u2.age
 group by u1.class, u1.age
 having count(*) = [number]
Run Code Online (Sandbox Code Playgroud)

为您提供每堂课中年龄最大的 [number] 名

 select  u1.class, u1.age, count(*)  from      user u1 join user u2 
 on u1.class = u2.class and u1.age <= u2.age
 group by u1.class, u1.age
 having count(*) = [number]
Run Code Online (Sandbox Code Playgroud)

让你成为每班最年轻的 [number] 名

如果两个人年龄相同,则可能无法正常工作,因为两人都会被退回。如果您只想返回其中之一,则需要一个唯一的键,并且查询会更复杂。


Tom*_*ter 0

在 SQL Server 中这非常简单:

select 
  *
from(
   select 
      *,
      row_number() over(order by age asc) as eldest
   from class order by age asc) a
where a.eldest = 10
Run Code Online (Sandbox Code Playgroud)

按照这种模式,对于MySQL,我想你想看看这个:http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/