我有一张包含汽车比赛结果的表格:
race_id participant_id time
1 15 1.0
1 21 1.05
1 27 2
2 27 2.55
2 15 2.75
2 21 3.45
我需要每个组中fisrt和第二个参与者之间的聚合表包含delta。使用窗口函数很容易完成,但MySQL中没有这样的选项:
race_id winner delta_to_second
1 15 0.05
2 27 0.2
如何在MySQL中完成这项工作?
答案 0 :(得分:1)
我会接受这个......但是更有效的选择......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(race_id INT NOT NULL
,participant_id INT NOT NULL
,time DECIMAL (5,2) NOT NULL
,PRIMARY KEY(race_id,participant_id)
);
INSERT INTO my_table VALUES
(1,15,1.0),
(1,21,1.05),
(1,27,2),
(2,27,2.55),
(2,15,2.75),
(2,21,3.45);
SELECT x.*
, MIN(y.time - x.time) delta
FROM my_table x
JOIN my_table y
ON y.race_id = x.race_id
AND y.time > x.time
JOIN
( SELECT race_id
, MIN(time) time
FROM my_table
GROUP
BY race_id
) z
ON z.race_id = x.race_id
AND z.time = x.time
GROUP
BY race_id
, participant_id
, time;
+---------+----------------+------+-------+
| race_id | participant_id | time | delta |
+---------+----------------+------+-------+
| 1 | 15 | 1.00 | 0.05 |
| 2 | 27 | 2.55 | 0.20 |
+---------+----------------+------+-------+
答案 1 :(得分:1)
考虑支持Windows函数的MYSQL8。