次のクエリに関するガイダンスをいただければ幸いです。実験とその現在の進捗状況のリストがあります(簡単にするために、ステータスを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%')
問題は、このコードは時間を無駄にするということです。結果セットは、390万のテーブルから引き出された45,000行です。これは、ほとんどの実験が終了ステータスにあるためです。コードは通過し、それらすべてを注文し、最後に終了したものだけを除外します。表の実験の約95%は終了段階にあります。最初にクエリですべての実験とその実験の「終了」がないステータスを選択する方法を理解できませんでした。次のことを試しましたが、パフォーマンスが非常に遅くなりました。
SELECT *
FROM exp_status
WHERE experiment NOT IN
(
SELECT experiment
FROM exp_status
WHERE status LIKE ('Finished%')
)
どんな助けでもいただければ幸いです!