Log(id、user、action、date)とActionTypes(action、type)の2つのテーブルがあります。アクションA0とタイプT0が与えられた場合、ユーザーごとに、A0の直後にアクションAiを使用した回数をカウントしたいと思いますが、タイプT0ではないLogのアクションはスキップします。したがって、たとえば:
ログ:
id user action date
----------------------------------------
1 mary start 2012-07-16 08:00:00
2 mary open 2012-07-16 09:00:00
3 john start 2012-07-16 09:00:00
4 mary play 2012-07-16 10:00:00
5 john open 2012-07-16 10:30:00
6 mary start 2012-07-16 11:00:00
7 mary jump 2012-07-16 12:00:00
8 mary close 2012-07-16 13:00:00
9 mary delete 2012-07-16 14:00:00
10 mary start 2012-07-16 15:00:00
11 mary open 2012-07-16 16:00:00
ActionTypes:
action type
--------------
start 0
open 1
play 1
jump 2
close 1
delete 1
したがって、アクション「start」とタイプ「1」が与えられると、答えは次のようになります。
user action ntimes
------------------------
mary open 2
mary close 1
john open 1
私の試みは
SELECT b.user,b.action, count(*)
FROM log a, log b
WHERE a.action='start' AND b.date>a.date AND a.user=b.user AND
1=(select type from ActionTypes where action=b.action) AND
not exists (SELECT c.action FROM log c where c.user=a.user AND
c.date>a.date and c.date<b.date and
1=(select type from ActionTypes where action=c.action))
GROUP BY b.user,b.action
ログテーブルには約100万のタプルがあり、クエリは機能しますが、遅すぎます。SQLServerを使用しています。それを速くする方法についてのヒントはありますか?ありがとう