2010-05-13 8 views
0

J'ai un problème délicat que j'essaie de trouver la méthode la plus efficace à résoudre.Comment trouver la dernière ligne pour chaque groupe de données

Voici une version simplifiée de ma structure View.


Tableau: Vérifications

 
AuditID | PublicationID | AuditEndDate | AuditStartDate 
1  | 3    | 13/05/2010 | 01/01/2010 
2  | 1    | 31/12/2009 | 01/10/2009 
3  | 3    | 31/03/2010 | 01/01/2010 
4  | 3    | 31/12/2009 | 01/10/2009 
5  | 2    | 31/03/2010 | 01/01/2010 
6  | 2    | 31/12/2009 | 01/10/2009 
7  | 1    | 30/09/2009 | 01/01/2009 

Il y a 3 requête est que j'ai besoin de cela. J'ai besoin d'un pour obtenir toutes les données. Le suivant pour obtenir uniquement les données d'historique (c'est-à-dire tout sauf exclure le dernier élément de données par AuditEndDate) et la dernière requête est d'obtenir le dernier élément de données (par AuditEndDate).

Il y a une couche supplémentaire de complexité que j'ai une restriction de date (c'est sur une base par utilisateur/groupe) où certains groupes d'utilisateurs peuvent seulement voir entre certaines dates. Vous remarquerez cela dans la clause where comme AuditEndDate < = blah et AuditStartDate> = blah

Pour chaque publication, sélectionnez toutes les données disponibles.

select * from Audits 
Where auditEndDate<='31/03/10' and AuditStartDate>='06/06/2009'; 

publication Foreach, sélectionnez toutes les données, mais excluent les dernières données disponibles (par AuditEndDate)

select * from Audits 
left join 
(select AuditId as aid, publicationID as pid 
    and max(auditEndDate) as pend 
from Audit where auditenddate <= '31/03/2009' /* user restrict */ 
group by pid) Ax 
on Ax.pid=Audit.pubid 
where pend!=Audits.auditenddate 
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */ 

publication Foreach, sélectionnez uniquement les dernières données disponibles (par AuditEndDate)

select * from Audits 
left join 
    (select AuditId as aid, publicationID as pid 
    and max(auditEndDate) as pend 
    from Audit where auditenddate <= '31/03/2009'/* user restrict */ 
    group by pid) Ax 
on Ax.pid=Audit.pubid 
where pend=Audits.auditenddate 
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */ 

Pour l'instant, les requêtes 1 et 3 fonctionnent correctement, mais la requête 2 renvoie simplement toutes les données au lieu de la restriction.

Quelqu'un peut-il m'aider?

Merci

jason

Répondre

0

D'accord, en fait ... Ces requêtes fonctionnent très bien. C'était mon PHP conditionnel pour les exécuter. Tout bon :)

Toute personne qui peut suggérer une méthode plus efficace pour cela, mais je serais intéressé à entendre cela. J'ai utilisé à l'origine des sous requêtes dans la clause where, et cela a fonctionné très lentement ... de 2 secondes il est passé à 50 secondes ....

Questions connexes