gpt4 book ai didi

mysql - 如何在 MySQL 中找到当时的最低值(单圈记录)?

转载 作者:行者123 更新时间:2023-11-29 05:47:51 26 4
gpt4 key购买 nike

我有一张表,里面有单圈时间。与早期条目相比,我正在寻找一种方法来找到当时的最低单圈时间(即单圈记录)。我只是为了好玩而学习 MySQL,而且我还是个初学者。(我将使用它来创建随时间变化的单圈记录图表。)

我有一个这样的表:

create table temp_laptimes(
lap_id INT NOT NULL,
driver VARCHAR(5) NOT NULL,
laptime FLOAT(5,1) NOT NULL,
lap_date DATE,
PRIMARY KEY ( lap_id )
);

INSERT INTO `temp_laptimes` (`lap_id`, `driver`, `laptime`, `lap_date`)
VALUES
('1', 'Dean', '56.8', '2019-01-01'),
('22', 'Zach', '59.7', '2019-02-01'),
('33', 'Carl', '56.1', '2019-03-01'),
('42', 'Zoe', '56.3', '2019-04-01'),
('50', 'Zach', '56.4', '2019-05-01'),
('61', 'Bob', '55.9', '2019-06-01'),
('73', 'Zeb', '56.2', '2019-07-01'),
('84', 'Anne', '55.7', '2019-08-01'),
('95', 'Dean', '55.9', '2019-09-01');

我想找到一段时间内的单圈记录,即这样的结果:

1  Dean  56.8  2019-01-01
33 Carl 56.1 2019-03-01
61 Bob 55.9 2019-06-01
84 Anne 55.7 2019-08-01

Dean 创造了第一圈时间,所以这是第一圈记录。然后 Carl 打破了那个,然后 Bob 打破了那个,最后 Anne 打破了那个,保持了当前的记录。

MySQL 在共享主机上运行。如您所见,lap_id 不是连续的。

我试过这样的事情:

SELECT * FROM `temp_laptimes` t1
JOIN (
SELECT lap_id, driver, laptime, lap_date
FROM temp_laptimes
GROUP BY laptime
)
AS t2 ON t1.laptime < t2.laptime AND t1.lap_date > t2.lap_date
ORDER BY t1.laptime ASC

这显然似乎找到了所有后一圈时间低于前一圈时间的事件。例如,安妮在结果中出现了 7 次,因为她用单圈时间跑赢了 7 次不同的单圈时间。鲍勃出现了 5 次。佐伊出现了 1 次,因为她上一次击败了扎克斯。

但我不知道如何只整理圈数记录。

正如我所说,我是一名新手,感谢您在正确方向上提供的任何帮助和指导。这只是我为了好玩而做的一个爱好项目。另外,英语不是我的母语,如果我的解释不清楚,请见谅。谢谢。

最佳答案

带有相关子查询的 NOT EXISTS 条件可以解决问题,例如:

SELECT *
FROM temp_laptimes t
WHERE NOT EXISTS (
SELECT 1
FROM temp_laptimes t1
WHERE t1.lap_date < t.lap_date AND t1.laptime < t.laptime
)

NOT EXISTS 条件确保不存在具有更小单圈时间的先前记录。

Demo on DB Fiddlde :

| lap_id | driver | laptime | lap_date   |
| ------ | ------ | ------- | ---------- |
| 1 | Dean | 56.8 | 2019-01-01 |
| 33 | Carl | 56.1 | 2019-03-01 |
| 61 | Bob | 55.9 | 2019-06-01 |
| 84 | Anne | 55.7 | 2019-08-01 |

如果您使用的是 MySQL 8.0,另一种可能更有效的方法是在子查询中使用窗口函数来计算当前记录和先前记录的最小单圈时间。然后,外部查询过滤掉最小值等于当前单圈时间的记录:

SELECT *
FROM (
SELECT
t.*,
MIN(laptime) OVER(ORDER BY lap_date) min_lap_time
FROM temp_laptimes t
) x WHERE laptime = min_lap_time;

Demo on DB Fiddle (相同的结果)。

关于mysql - 如何在 MySQL 中找到当时的最低值(单圈记录)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com