>>non basta che fai "SELECT TOP 1 FROM TABELLA WHERE IDARTICOLO=....
>>ORDER BY IDMOVIMENTO DESC" ?
>
>Non va bene perché l'esempio che ho fatto è di 3 righe con lo
>stesso articolo, ma io ho bisogno di una query che faccia il
>group by sull'articolo. Il TOP 1 mi restituisce un solo record,
>io ne voglio 1 per articolo.
Ecco non avevo letto fino in fondo. 
Il risultato che vuoi ottenere non potrai mai ottenerlo con una unica query, ma dovrai basarti su una CTE o su una tabella derivata.
Questo è un esempio basato sul precedente che ho postato:
USE tempdb;
CREATE TABLE dbo.foo(
IDMagazzino char(3) NOT NULL,
IDArticolo varchar(10) NOT NULL,
IDMovimento int NOT NULL
);
INSERT dbo.foo VALUES
('A01', 'Art001', 1)
, ('A02', 'Art001', 2)
, ('A03', 'Art001', 3)
, ('A02', 'Art002', 1)
, ('A05', 'Art003', 1)
, ('A01', 'Art003', 2);
WITH CTE_GetKey (IDArticolo, IDMovimento) AS
(
SELECT IDArticolo, MAX(IDMovimento)
FROM dbo.foo
GROUP BY IDArticolo
)
SELECT F.IDMagazzino, F.IDArticolo
FROM dbo.foo AS F
JOIN CTE_GetKey AS CTE
ON F.IDArticolo = CTE.IDArticolo
AND F.IDMovimento = CTE.IDMovimento
ORDER BY F.IDArticolo;
/* Output:
IDMagazzino IDArticolo
----------- ----------
A03 Art001
A02 Art002
A01 Art003
(3 row(s) affected)
*/
DROP TABLE dbo.foo;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org