我有一个这样的表结构:
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;