2011-10-24 4 views
1

J'ai ces données dans ma table:Intéressant requête SQL

onum amt   odate      cnum snum 

3001 18,69  1990-03-10 00:00:00.000  2008 1007 
3002 1900,10  1990-03-10 00:00:00.000  2007 1004 
3003 767,19  1990-03-10 00:00:00.000  2001 1001 
3005 5160,45  1990-03-10 00:00:00.000  2003 1002 
3006 1098,16  1990-03-10 00:00:00.000  2008 1007 
3007 75,75  1990-03-10 00:00:00.000  2004 1002 
3008 4723,00  1990-05-10 00:00:00.000  2006 1001 
3009 1713,23  1990-04-10 00:00:00.000  2002 1003 
3010 1309,95  1990-06-10 00:00:00.000  2004 1002 
3011 9891,88  1990-06-10 00:00:00.000  2006 1001 

J'ai besoin obtenir ce résultat:

amt   odate      snum 

5160,45  1990-03-10 00:00:00.000  1002 
4723,00  1990-05-10 00:00:00.000  1001 
9891,88  1990-06-10 00:00:00.000  1001 

qui est je sélectionne le maximum amt le chaque jour odate, mais avec l'affichage du vendeur snum

si j'écris ceci:

SELECT MAX(amt), odate, snum 
FROM [Understanding].[dbo].[Orders] 
GROUP BY odate, snum 

la sortie est erronée car elle affiche les groupes par jours et vendeurs.

Répondre

4
;with C as 
(
    select amt, 
     odate, 
     snum, 
     row_number() over(partition by odate order by amt desc) as rn 
    from Orders 
) 
select amt, 
     odate, 
     snum 
from C 
where rn = 1  
+2

Je ne pourrai jamais me habituer au fait que SQL Server nécessite un point-virgule au début d'une déclaration ...;) –

+1

@a_horse_with_no_name - Eh bien, c'est en fait le dernier caractère de la déclaration avant. L'instruction 'merge' nécessite qu'elle se termine par un point-virgule. 'with' exige que l'instruction précédente soit terminée par un point-virgule. Si SQL Server exigeait que chaque instruction soit terminée par un point-virgule, elle serait beaucoup plus cohérente. Peut-être le fera-t-il dans une future version. –

+0

@a_horse_with_no_name: 'WITH' peut être utilisé dans divers contextes dans SQL Server. Quand il introduit une (liste de) CTE (s), il doit être au début d'une déclaration, dans d'autres cas il est supposé être ailleurs mais pas * au début. Le point-virgule supprime simplement l'ambiguïté quant à la signification de 'WITH'. Vous n'avez pas besoin de mettre un point-virgule lorsqu'il n'y a pas d'instruction avant 'WITH' (dans le contexte de la définition CTE). –

0
select a.*,b.snum 
from 
(
select MAX(amt) as amt 
     ,odate 
from Orders 
group by odate 
)A INNER JOIN Orders B 
ON A.amt = b.amt 
order by a.odate