我很乐意为您提供翻译帮助,以下是您需要翻译的内容:
事实上,这段代码浪费了很多时间。结果集中有45,000行数据,从一个包含3.9百万行的表中提取而来。这是因为大多数实验都处于完成状态。代码会遍历所有实验并对它们进行排序,最后只过滤掉已完成的实验。表中约95%的实验都处于完成阶段。我无法想出如何使查询首先挑选出所有没有“Finished”状态的实验和状态。我尝试了以下方法,但性能非常慢。
我需要一些关于以下查询的指导。我们有一个实验列表及其当前进度状态(为简单起见,我已将状态减少到4种,但我们的数据中有10种不同的状态)。我最终需要返回所有未完成实验的当前状态列表。
假设有一个表exp_status,
Experiment | ID | Status
----------------------------
A | 1 | Starting
A | 2 | Working On It
B | 3 | Starting
B | 4 | Working On It
B | 5 | Finished Type I
C | 6 | Starting
D | 7 | Starting
D | 8 | Working On It
D | 9 | Finished Type II
E | 10 | Starting
E | 11 | Working On It
F | 12 | Starting
G | 13 | Starting
H | 14 | Starting
H | 15 | Working On It
H | 16 | Finished Type II
期望的结果集:
Experiment | ID | Status
----------------------------
A | 2 | Working On It
C | 6 | Starting
E | 11 | Working On It
F | 12 | Starting
G | 13 | Starting
最新的ID号将对应于最新的状态。
目前,我拥有的代码执行需要 150 秒。
SELECT *
FROM
(SELECT Experiment, ID, Status,
row_number () over (partition by Experiment
order by ID desc) as rn
FROM exp_status)
WHERE rn = 1
AND status NOT LIKE ('Finished%')
事实上,这段代码浪费了很多时间。结果集中有45,000行数据,从一个包含3.9百万行的表中提取而来。这是因为大多数实验都处于完成状态。代码会遍历所有实验并对它们进行排序,最后只过滤掉已完成的实验。表中约95%的实验都处于完成阶段。我无法想出如何使查询首先挑选出所有没有“Finished”状态的实验和状态。我尝试了以下方法,但性能非常慢。
SELECT *
FROM exp_status
WHERE experiment NOT IN
(
SELECT experiment
FROM exp_status
WHERE status LIKE ('Finished%')
)
非常感谢您的帮助!
status not like ...
条件移入带有row_number()
函数的内部选择中可能是值得尝试的。 - user330315