列を持つ非常に単純化されたテーブルが与えられた場合
Name, Action, Status, Timepoint
1 "A" "Open" "OK" "2012-09-04 10:10:00"
2 "A" "Close" "OK" "2012-09-04 10:05:00"
3 "A" "Close" "ERROR" "2012-09-04 10:02:00"
4 "B" "Look" "NICE" "2012-09-04 10:05:00"
5 "B" "Blow" "COLD" "2012-09-04 10:00:00"
6 "C" "Laugh" "OK" "2012-09-04 10:02:00"
7 "C" "Laugh" "MUTE" "2012-09-04 10:00:00"
NameとActionの組み合わせの各行を最も効率的に選択するにはどうすればよいですか?ただし、最新のTimepointのActionのみを選択します。上記の例では、行を返します
1, 2, 4, 5, 6
動作中の実装は、行をフェッチし、サブクエリを使用して、新しいTimepointの同じNameとActionの組み合わせを持つ行が 0 行ある場合にのみ返します。しかし、データセットが大きくなると、それは非常に非効率に思えます。こんな感じです
SELECT Name, Action, Status, Timepoint
FROM foobar
WHERE Name IN (... Names of interest ...) AND
Status IN (... statuses of interest ...) AND
(SELECT COUNT(*) FROM foobar AS t2 WHERE t2.Name = Name AND t2.Status = Status AND t2.Timepoint > Timepoint) = 0
order by Name, Timepoint