特定の一連のイベントを満たすUserIDのレコードを取得しようとしています。ユーザーがJOINを持っていて、それに続くCANCELとその後のJOINがある場合、結果セットでそれらを戻したいと思います。必要に応じて、一度に1日または数日にこのクエリを実行する必要があります。イベントの特定のシーケンスを満たす行を返すにはどうすればよいですか?
次の表は、シーケンスを満たしていないユーザーIDの例を示しています。
+--------+--------+---------------------+------------+------------------+
| rownum | UserID | Timestamp | ActionType | Return in query? |
+--------+--------+---------------------+------------+------------------+
| 1 | 12345 | 2016-11-01 08:25:39 | JOIN | yes |
| 2 | 12345 | 2016-11-01 08:27:00 | NULL | yes |
| 3 | 12345 | 2016-11-01 08:28:20 | DOWNGRADE | yes |
| 4 | 12345 | 2016-11-01 08:31:34 | NULL | yes |
| 5 | 12345 | 2016-11-01 08:32:44 | CANCEL | yes |
| 6 | 12345 | 2016-11-01 08:45:51 | NULL | yes |
| 7 | 12345 | 2016-11-01 08:50:57 | JOIN | yes |
| 1 | 9876 | 2016-11-01 16:05:42 | JOIN | yes |
| 2 | 9876 | 2016-11-01 16:07:33 | CANCEL | yes |
| 3 | 9876 | 2016-11-01 16:09:09 | JOIN | yes |
| 1 | 56565 | 2016-11-01 18:15:16 | JOIN | no |
| 2 | 56565 | 2016-11-01 19:22:25 | CANCEL | no |
| 3 | 56565 | 2016-11-01 20:05:05 | CANCEL | no |
| 1 | 34343 | 2016-11-01 05:32:56 | JOIN | no |
+--------+--------+---------------------+------------+------------------+
私はギャップや島々をよく読んで、そして私が達成しようとしているものを周りに踊る複雑なフォーラムの投稿のすべての種類を見てきました。
SELECT
ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY tmsmp) rownum
,UserID
,tmstmp
,ActionType
FROM
t
INNER JOIN (
SELECT UserID
FROM t
WHERE tmstmp BETWEEN '2016-11-20 00:00:01' AND '2016-11-20 11:59:59'
GROUP BY UserID
HAVING COUNT(*) >= 2
) AS sub ON t1.UserID = sub.UserID
がご入力いただき、ありがとうございます:
現在、私が行うことができるよすべては私が必要とするシーケンス・ロジック上の制約なしに、レコードの1日分を見ています!
3つのレコードを順番に並べる必要がありますか?つまり、ギャップがあるか、ギャップのないジョイン/キャンセル/ジョインが必要なのでしょうか? –
返された行は、テーブルから引き抜かれる連続した希望の順序である必要はありませんが、将来のニーズに対応するために両方の出力を達成するというあなたの考えを知りたいと思うでしょう。ありがとう! – psrpsrpsr
ちょっと面白いですが、もう1つの解決策として、 'select * from(userid、string_agg(actiontype、 '、タイムスタンプ順)/ * filter(actiontypeはnullではありません)*/'%JOIN、CANCEL、JOIN%'; ' – Abelisto