2009-07-09 6 views
1

J'ai du mal à essayer d'optimiser cette requête avec OVER (PARTITION BY ...) car le champ id de la table contenant le maxDate doit se rapporter à l'autre table.Comment puis-je optimiser une requête de date MAX relative à une autre entité de table?

La requête de travail est:

SELECT maxReadDate, Equip.idProtocol 
     FROM Equip, 
     ( 
      SELECT idEquip as idEquipTot, MAX(readDate) AS maxReadDate 
      FROM Totalizer 
      WHERE Totalizer.idEquip = xxx 
      GROUP BY idEquip 
    ) 
     WHERE Equip.idEquip = idEquipTot 

Ce que je suis en train de faire est quelque chose près, mais cela n'a pas fonctionné:

SELECT maxReadDate, Equip.idProtocol 
     FROM Equip, 
     ( 
      SELECT idEquip as idEquipTot, MAX(readDate) OVER (PARTITION BY idEquip) maxReadDate 
      FROM Totalizer 
    ) 
     WHERE Equip.idEquip = idEquipTot 
     AND Equip.lastReadDate = maxReadDate 
     AND idEquipoTot = xxx 

Merci.

La solution:

SELECT DISTINCT e.idProtocol, e.idEquip, MAX(t.readDate) 
     OVER (PARTITION BY e.idEquip) maxReadDate 
FROM Equip e 
JOIN Totalizer t 
ON  t.idEquip = e.idEquip 
WHERE e.idEquip = ? 
+0

Pourriez-vous s'il vous plaît fournir quelques exemples de données et l'ensemble de résultats que vous souhaitez obtenir? – Quassnoi

Répondre

2
SELECT e.idProtocol, e.idEquip, MAX(t.readDate) OVER (PARTITION BY e.idEquip) maxReadDate 
FROM Equip e 
JOIN Totalizer t 
ON  t.idEquip = e.idEquip 
+0

Belle solution, mais de cette façon, la date maxi est-elle pré-sélectionnée avant que vous fassiez réellement une recherche sur la totalité de la table d'équipement? Je pensais utiliser une fonction analytique au lieu de faire une jointure ou sous-sélection native, ce que j'ai fini par faire. Cheers. – lucasarruda

+0

Vous aurez probablement besoin d'un DISTINCT là aussi. –

+0

Oui, vous avez également besoin d'un distinct. Ce dont j'avais besoin, c'est d'énumérer non toutes les dates maximales, mais la date maximale d'un équipement spécifique. Le filtrage et l'ajout de DISTINCT l'ont fait fonctionner. Merci, les gars. Au-dessus de la solution: SELECT DISTINCT e.idProtocol, e.idEquip, MAX (t.readDate) SUR (PARTITION PAR e.idEquip) maxReadDate DE Equip e REJOIGNEZ totalisateurs t SUR t.idEquip = e.idEquip O e e.idEquip =? – lucasarruda

0

vous a pas besoin de fonctions analytiques utilisant simplement le regroupement

SELECT e.idProtocol, e.idEquip, MAX(t.readDate) as maxReadDate 
FROM Equip e 
JOIN Totalizer t 
ON  t.idEquip = e.idEquip 
WHERE e.idEquip = ? 
group by e.idProtocol, e.idEquip 
+0

mais ce que je voulais, c'était que le MAX readDate de chaque équipement soit déjà présélectionné. Je ne retournerais ces enregistrements précis de chaque équipement. Donc, en ce sens, je n'ai pas besoin de regrouper chaque équipement/protocole/donnée, mais d'obtenir la dernière lecture de chacun par protocole. – lucasarruda

Questions connexes