2013-04-17 2 views
0

J'ai deux tables:Utilisation de la fonction max

TotalTimeTable 
(date date,time time) 

FinalListA 
(date date, time time, A int, B int) 

Je courais la requête suivante:

SELECT t1.date, 
     t1.time, 
     max(t2.time) 
FROM TotalTimeTable t1, 
    FinalListA t2 
WHERE t2.date=t1.date 
    AND t2.time <= t1.time 
GROUP BY t1.date, 
     t1.time 
ORDER BY t1.date, 
     t1.time 

est-il un moyen de sortir A et B de FinalListA où le temps = « max (t2.time) "dans la même requête?

TotalTimeTable:

date  time  
2006-01-01 9:30:01  
2006-01-01 9:30:02 
2006-01-01 9:30:03 
2006-01-01 9:30:04 
2006-01-01 9:30:05 
2006-01-01 9:30:06 

FinalListA:

date  time  A B 
2006-01-01 9:28:01 1 4 
2006-01-01 9:30:02 2 3 
2006-01-01 9:30:04 4 7 
2006-01-01 9:30:07 6 4 
2006-01-01 9:30:10 8 9 
2006-01-01 9:30:11 1 2 

Le résultat attendu est:

date  time  A B 
2006-01-01 9:30:01 1 4 
2006-01-01 9:30:02 2 3 
2006-01-01 9:30:03 2 3 
2006-01-01 9:30:04 4 7 
2006-01-01 9:30:05 4 7 
2006-01-01 9:30:06 4 7 

Le temps est de TotalTimeTable FinalListA.time ne doivent pas être le résultat.

+2

S'il vous plaît, fournir des lignes d'échantillons. –

Répondre

0

L'utilisation croisée se:

SELECT t1.date 
    , t1.time 
    , t2.time 
    , t2.A 
    , t2.B 
FROM TotalTimeTable t1 
CROSS APPLY (
SELECT TOP(1) 
    T2.time 
, T2.A 
, T2.B 
FROM FinalListA t2 
WHERE T2.date = T1.date 
AND T2.time <= t1.time 
ORDER BY T2.time DESC 
) AS T2 
ORDER BY t1.date, 
    t1.time 
+0

Désolé, n'a pas eu le temps de le tester pour le moment –

+0

Le résultat est correct mais il est un peu plus lent que de @techdo –

+0

Ce sont les mêmes mais merci pour le vote vers le bas. – Serge

1

S'il vous plaît essayer:

SELECT t1.date, 
     t1.time, 
     (select top 1 t2.A from FinalListA t2 where t2.date=t1.date and t2.Time<=t1.Time order by t2.Time desc) A, 
     (select top 1 t2.B from FinalListA t2 where t2.date=t1.date and t2.Time<=t1.Time order by t2.Time desc) B 
FROM TotalTimeTable t1 

ou en utilisant la gauche rejoindre

select 
    x.date, 
    x.Time, 
    x.A, 
    x.B 
from(
    SELECT t1.*, 
      t2.A, 
      t2.B, 
      ROW_NUMBER() over (PARTITION BY t1.date, t1.time order by t2.time desc) RNum 
    FROM TotalTimeTable t1 left join 
     FinalListA t2 on t1.date=t2.date and t2.Time<=t1.Time 
)x where RNum=1 

ou en utilisant CROSS APPLY

SELECT t1.date, 
     t1.time, 
     x.* 
FROM TotalTimeTable t1 cross apply (
SELECT TOP 1 t2.A, t2.B from FinalListA t2 where t2.date=t1.date and t2.Time<=t1.Time order by t2.Time desc)x 
+0

Veuillez ajouter des données d'échantillon et la sortie attendue. – TechDo

+0

J'ai ajouté des exemples de données maintenant, je vais ajouter la sortie attendue dans une minute –

+0

S'il vous plaît vérifier la réponse édité en utilisant sous-requête et à gauche rejoindre. – TechDo

0

Vous pouvez utiliser votre requête d'origine en tant que sous-requête de contrainte (sans ORDER BY)

SELECT t1.Date, t1.Time, t2.Time, t2.A, t2.B 
FROM TotalTimeTable t1 
INNER JOIN 
(
    SELECT t1.date, 
      t1.time, 
      maxt2Time = max(t2.time) 
    FROM TotalTimeTable t1, 
     FinalListA t2 
    WHERE t2.date=t1.date 
     AND t2.time <= t1.time 
    GROUP BY t1.date, 
      t1.time 
) tmax 
ON t1.Date = tmax.date AND t1.Time = tmax.Time 
INNER JOIN FinalListA t2 ON t2.Date = tmax.Date AND t2.Time = tmax.maxt2Time 
+0

@ L'application croisée de Serge ci-dessous est environ 50% plus rapide – Ackroydd

+0

Oui, c'est comme cela que je prévois de le faire, mais je veux vérifier s'il y a une requête plus simple/plus rapide que celle-ci. –

+0

Pourrait réduire la sous-requête à INNER JOIN (SELECT date, heure = max (heure) à partir de la date FinalListA GROUP BY) tmax – Ackroydd