次のイベントの日付を見つけるソリューションは見つかりましたが、イベントのすべてのデータを含むソリューションは見つかりませんでした。不正行為でそれを成し遂げることができますが、それは mysql でのみ機能し、vertica では失敗します。
これが私が解決しようとしている問題です:
a に続き、タイプ a ではない最初のイベント X からのデータを含むすべてのイベント a を表示したいと考えています。カット アンド ペーストの例を以下に示します。
CREATE TABLE events (user_id int ,created_at int, event varchar(20));
INSERT INTO events values (0,0, 'a');
INSERT INTO events values (0,1, 'b');
INSERT INTO events values (0,2, 'c');
INSERT INTO events values (0,3, 'a');
INSERT INTO events values (0,4, 'c');
INSERT INTO events values (0,5, 'b');
INSERT INTO events values (0,6, 'a');
INSERT INTO events values (0,7, 'a');
INSERT INTO events values (0,8, 'd');
SELECT * FROM events;
+---------+------------+-------+
| user_id | created_at | event |
+---------+------------+-------+
| 0 | 0 | a |
| 0 | 1 | b |
| 0 | 2 | c |
| 0 | 3 | a |
| 0 | 4 | c |
| 0 | 5 | b |
| 0 | 6 | a |
| 0 | 7 | a |
| 0 | 8 | d |
+---------+------------+-------+
9 rows in set (0.00 sec)
両方を取得する方法を知っている結果は次のとおりですが、イベント情報も取得できないようです。
SELECT user_id, MAX(purchased) AS purchased, spent
FROM (
SELECT
e1.user_id AS user_id, e1.created_at AS purchased,
MIN(e2.created_at) AS spent
FROM events e1, events e2
WHERE
e1.user_id = e2.user_id AND e1.created_at <= e2.created_at AND
e1.Event = 'a' AND e2.Event != 'a'
GROUP BY e1.user_id, e1.created_at
) e3 GROUP BY user_id, spent;
user_id | purchased | spent
---------+-----------+-------
0 | 0 | 1
0 | 3 | 4
0 | 7 | 8
ここでイベント タイプも必要な場合、上記のクエリでは機能しません。これは、group-by (必要なものではない) または集計 (必要なものではない) でイベント フィールドを使用する必要があるためです。また)。mysqlで十分に面白いですが、私はその不正行為を考えています。これにはverticaを使用する必要があるため、役に立ちません:
SELECT user_id, MAX(purchased) as purchased, spent, event FROM (
SELECT
e1.User_ID AS user_id,
e1.created_at AS purchased,
MIN(e2.created_at) AS spent,
e2.event AS event
FROM events e1, events e2
WHERE
e1.user_id = e2.user_id AND e1.created_at <= e2.created_at AND
e1.Event = 'a' AND e2.Event != 'a'
GROUP BY
e1.user_id,e1.created_at
) e3 GROUP BY user_id, spent;
+---------+-----------+-------+-------+
| user_id | purchased | spent | event |
+---------+-----------+-------+-------+
| 0 | 0 | 1 | b |
| 0 | 3 | 4 | c |
| 0 | 7 | 8 | d |
+---------+-----------+-------+-------+
3 rows in set (0.00 sec)
vertica の場合、同じクエリで次のエラーがスローされます: ERROR 2640: Column "e2.event" must appear in the GROUP BY clause or be used in an aggregate function
チートを許可しない vertica またはその他のデータベースで実行したときに上記と同じ結果を得ることができるように、2 つのイベントをすべての列とペアにして不正行為を行わずに取得するためのエレガントなソリューションは何ですか? サンプル データでは、必要な追加の列が 1 つだけあります。これはイベント タイプですが、実際には 2 つまたは 3 つの列になります。
回答する前に投稿されたサンプルデータで試してみてください:)