在 SQL 中使用 group by 时获取最高的两个值

Get highest two values when using group by in SQL

我有这样的 table 结构:

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 方言支持 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;

如果您正在使用 SQL 服务器,您可以使用 ROW_NUMBER 和一个常见的 table 表达式。我还没有测试过这个,但试一试:

;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;