在 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;
我有这样的 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;