J'ai deux tables. Table1 CODE>: SELECT t1.ID1, t1.ID2, t1.ID3, t1.ID4, maxDate, avgCost
FROM Table1 t1
JOIN ( SELECT ID1, ID2, ID3, ID4, MAX(Date) as maxDate, AVG(Cost) as avgCost
FROM Table2 t2
GROUP BY ID1, ID2, ID3, ID4 ) t2
ON t2.ID1 = t1.ID1
AND t2.ID2 = t1.ID2
AND t2.ID3 = t1.ID3
AND t2.ID4 = t1.ID4
WHERE maxDate = (SELECT MAX(Date) from Table2 GROUP BY ID1, ID2, ID3, ID4);
3 Réponses :
Essayez ceci, pourrait ne pas être la solution optimale, mais vous pouvez la juquer la meilleure performance
WITH MAXDATE AS (
SELECT MAX(DATE) AS MAXDATE,
ID1,
ID2,
ID3,
ID4
FROM TABLE2
GROUP BY ID1,ID2,ID3,ID4
)
SELECT ID1, ID2, ID3, ID4, MAX(DATE), AVG(COST)
FROM TABLE1 T1 JOIN TABLE2 T2
ON T1.ID1 = T2.ID1
ON T1.ID2 = T2.ID2
ON T1.ID3 = T2.ID3
ON T1.ID4 = T2.ID4 JOIN MAXDATE T3
ON T1.ID1 = T3.ID1
ON T1.ID2 = T3.ID2
ON T1.ID3 = T3.ID3
ON T1.ID4 = T3.ID4
ON T2.DATE = T3.MAXDATE
GROUP BY T1.ID1
T1.ID2
T1.ID3
T1.ID4
Vous semblez vouloir:
select id1, id2, id3, id4, date, avg(cost)
from (select t2.*,
dense_rank() over (partition by id1, id2, id3, id4 order by date desc) as seqnum
from table2 t2
where (id1, id2, id3, id4) in (select id1, id2, id3, id4 from table1)
) t2
where seqnum = 1
group by id1, id2, id3, id4, date;
Oui, cela le résout. Regardé par-dessus certaines informations pour dense_rank () code> et partition par code> et il semble avoir un sens. Pourriez-vous expliquer ce que le où seqnum = 1 code> fait?
-1 De moi pour utiliser une fonction analytique où ce n'est pas nécessaire. La solution correcte consiste à utiliser la fonction d'agrégat Dernière code> - La requête devient beaucoup plus efficace.
Votre définition de à la place, pour calculer la moyenne t2 code> ressemble à ceci: Dernière code>, comme: p>
Dans votre exemple de données, il n'y a pas les valeurs T1.ID4. Pourquoi ???
@scAISEDGE Désolé, corrigé
Basé sur l'échantillon de données de votre tableau 2, vous ne pouvez pas obtenir deux lignes .. Êtes-vous sûr que les données sont identiques et il n'y a pas de caractère caché .. qui renvoie 2 rangées agrégées
@SCAISEZ OKY, donc j'ai simplifié les comparaisons étant faites un peu. Le 4ème identifiant est en fait une chaîne et la comparaison est
substr (t1.id4, 1, 5) = substr (t2.id4, 1, 5) code>. Il est vrai que, oùcoûte code> est0.00 code> danstable2 code>, il y a 6 caractères dansID4 code> pendant que le reste n'a que le reste 5. Mais cela ne devrait-il pas être réconcilié avec le substrateur(t2.id4, 1, 5) code>?Et vous devriez avoir
0.2 code> etavgcost code> résultat.@ Barbarosözhan regarde mon explication. Une partie du problème est que chaque fois que
coût code> est0.00 code> danstable2 code>, il n'est pas compté dans leavg (coût) code > fonction. Je suis retourné deux rangées quand il ne devrait y avoir qu'unJe l'ai déjà regardé votre explication, mais vous devriez déjà besoin d'avoir un row.Consider: dbfiddle.uk / ...
@ Barbarosözhan d'accord, j'avais réellement réparé ça. Si vous voyez les commentaires ci-dessus,
ID4 code> est en fait une chaîne et je devais comparer les 5 premiers caractères de cette chaîne. J'ai corrigé le problème en modifiant monGroupe par code> àGroupe par ID1, ID2, ID3, SUBSTR (ID4, 1, 5) CODE>. Merci!