2010-12-15 37 views
0

J'ai une table, Events, qui a un EventId (PK), Date, EmployeeId (FK) et StatusId (FK).SELECT enregistrements base sur le contenu des enregistrements précédents (aucune relation)

Je dois sélectionner un enregistrement en fonction des critères de l'enregistrement qui s'est produit directement avant (chronologiquement par date) pour un employé particulier. Je n'ai aucune idée de comment faire cela puisqu'il n'y a pas de relation.

Je voudrais sélectionner un compte de tous les événements, regroupés par EmployeeId, où:

(a) StatusID = 1
(b) Le dernier événement par ce EmployeeId (par ordre chronologique) a une StatusID de 9.

Notez que l'enregistrement précédent pour tout événement n'est pas nécessairement lié à cet employé.

* édité pour noter que j'utilise SQL Server, et que je référence chronologiquement l'événement précédent par date!

+0

* chronologiquement * basé sur la date ou –

+0

EventID Pourquoi ne pas stocker 'parent_id' avec référence à la rangée précédente alors? Btw, la réponse dépend fortement de ce que vous utilisez SGBD. Dans Oracle, par exemple, grâce aux fonctions analytiques, cela peut être fait très facilement. – zerkms

Répondre

1

Ok, bien, vous pouvez faire une sous requête à savoir

SELECT EmployeeID, COUNT(*) 
     FROM Events e1 
WHERE (SELECT TOP 1 StatusID FROM Events e2 WHERE e1.EmployeeID = e2.EmployeeID ORDER 
     BY Date desc) = 9 
GROUP BY EmployeeID, COUNT(*) 
0
Events (EventId, Date, EmployeeId, StatusId) 

select EmployeeId, count(*) from Events as e1 
where e1.StatusId = 1 
     and exists (select e2.EventID from Events as e2 
       where e2.EmployeeId=e1.EmployeeId and e1.date > e2.date and e2.StatusId = 9 order by e2.date desc limit 1) 
group by EmployeeId 

quelque chose comme ça

+0

Cela fonctionne parfaitement, Dan! Merci beaucoup! – Brett

+0

Cela ne fonctionnera pas si l'enregistrement précédent avait un statut autre que 9. –

+0

Peut-être que ma question n'était pas claire, mais c'est la fonctionnalité prévue. Essentiellement, les règles métier de l'application requièrent qu'un Evénement de StatusId = 9 DOIT précéder immédiatement un Evénement avec StatusId = 1 pour être considéré comme un Evénement "Successful". Je dois ensuite retourner le décompte de tous les événements «réussis» regroupés par employé. – Brett