在SQL中使用groupby时,获得最高的两个值

  • 本文关键字:两个 SQL groupby sql group-by
  • 更新时间 :
  • 英文 :


我有一个这样的表结构:

id | fname     |   lname    |   event    |     time    
---------------------------------------------------------
1    Name          One          1600m         4:37.00
2    Another       Name         1600m         4:55.00
3    Some          Person       1600m         4:27.00
4   Random         Name         1600m         5:04.00

有许多行具有许多名称、不同的事件(跟踪事件)和时间。

我想做的是在每个活动中获得每个人最低(最快)的两次。

我已经可以使用这个SQL:了

SELECT * FROM Times GROUP BY event, fname, lname ORDER BY time ASC

以获得每个人参加每个活动的最低(最快)时间。

如何使用GROUP BY获得每个人的两次最低次数。(或任何其他更好的方式。

如果您使用的是SQL Server,则可以使用ROW_NUMBER和通用表表达式。我还没有测试过,但试试看:

;WITH cte AS
(
   SELECT *,
       ROW_NUMBER() OVER (PARTITION BY event, fname, lname ORDER BY time ASC) AS TopTimes 
   FROM Times 
   GROUP BY event, fname, lname 
   ORDER BY time ASC
)
SELECT *
FROM cte
WHERE TopTimes < 3;

大多数SQL方言都支持ANSI标准的row_number()函数。这是最好的方法:

select t.*
from (select t.*,
             row_number() over (partition by event, fname, lname order by time asc) as seqnum
      from table t
     ) t
where seqnum <= 2;

最新更新