2017-08-17 2 views
1

Je travaille sur un flux d'événements pour la première fois, ce qui fait que je n'ai pas fait grand-chose à grande échelle. J'essaye d'écrire le manuscrit de SQL pour me donner le temps de chargement du lobby de causerie une fois que l'utilisateur s'est connecté. Ci-dessous j'ai un exemple de script pour un ETL. Je veux savoir s'il y a une meilleure façon de faire qui rejoint ce que j'ai fait. J'ai également pensé à diviser les sous-requêtes en deux tables séparées et à faire une jointure à gauche, mais je ne suis pas certain de quelle manière est considérée comme optimale et meilleure. J'ai aussi pensé faire du CTE.Quelle est la méthode efficace d'auto-jonction d'un flux d'événements?

DROP TABLE IF EXISTS event_stream; 
create table event_stream 
(
    event varchar(50), 
    action varchar(100), 
    userid int, 
    session_id int, 
    date timestamp 
); 


INSERT INTO event_stream(event, action, userid, date,session_id) VALUES 
('login', 'success', 1, '2017-08-15 12:30',100), 
('chatlobby','loaded', 1, '2017-08-15 12:30:10',100), 
('entered_chatroom','chatroom1',1,'8/15/2017 12:31',100), 
('login', 'success', 54, '2017-08-15 01:30',101), 
('chatlobby','loaded', 54, '2017-08-15 01:30:05',101), 
('entered_chatroom','chatroom2',54,'8/15/2017 01:31',101); 

Select a.userid, a.session_id, b.date - a.date as load_time 
from 
    (Select * from event_stream where event = 'login' and action='success') a 
JOIN 
    (Select * from event_stream where event = 'chatlobby' and action = 'loaded') b 
ON a.session_id = b.session_id 

Le script ci-dessus que j'ai créé été fait en utilisant PostgreSQL

+0

Je suis désolé si je suis impoli, mais n'est pas un ETL est utilisé précisément pour remplacer SQL avec plus de code visuel? Et en passant, quel est votre ETL? – AlainD

+0

Eh bien ... ouais ETL mais la société est en train de passer à cette infrastructure et SPARK et d'autres outils après avoir été pris en considération alors que nous essayons de maintenir le fonctionnement de l'entreprise comme d'habitude. – codeBarer

+1

Ok, alors qu'ils sont occupés à décider dans quelle direction ils vont effectuer la transition, peut-être que vous téléchargez [Kettle] (https://sourceforge.net/projects/pentaho/files/Data%20Integration). C'est un véritable ETL: c'est un travail, c'est gratuit, robuste, transparent pour SPARK et d'autres technos de sources de données, et vous pouvez copier/coller votre SQL directement, afin de continuer à fonctionner comme d'habitude, sous le radar. Exactement comme moi. (Note: je n'ai aucun intérêt commercial) – AlainD

Répondre

1

L'équivalent de vos sous-requêtes est la suivante:

from event_stream login join event_stream load on login.session_id = load.session.id 
and login.action = 'success' 
and load.action = 'loaded' 

C'est plus simple et la simplicité a ses mérites. Pour voir quelle voie fonctionne le plus rapidement, testez-les.

+0

Merci @ dan-bracuk que faire si je devais faire un groupe dans les sous-requêtes parce que les enregistrements en double? – codeBarer

+0

Cela change votre question. –

+0

Oh c'est quelque chose que je pensais juste que faire si cela se produit. Ce que vous avez donné comme solution est génial! – codeBarer