>So che si può fare ma al momento non trovo la via giusta....qualcuno
>mi aiuta?
Ciao,
Ti illustro quattro possibili soluzioni:
USE tempdb;
CREATE TABLE dbo.Rinnovi(
CodPT int NOT NULL,
CodRinnovo int NOT NULL,
DataScadenza date NULL,
TipoRinnovo nvarchar(50) NULL,
CONSTRAINT PK_Rinnovi PRIMARY KEY(CodPT, CodRinnovo)
);
INSERT dbo.Rinnovi
VALUES (1, 1, '20110501', 'test')
, (1, 2, '20120501', 'annuale')
, (2, 1, '20121118', 'test')
, (3, 1, '20100606', 'test')
, (3, 2, '20110606', 'annuale')
, (3, 3, '20120606', 'triennale');
/* Prima soluzione: tabella derivata che restituisce la chiave di ricerca
Funziona in pratica con tutte le versioni di SQL Server
*/
SELECT R.CodPT, R.DataScadenza, R.TipoRinnovo
FROM dbo.Rinnovi AS R
JOIN (
SELECT CodPT, MAX(DataScadenza) AS DataScadenza
FROM dbo.Rinnovi
GROUP BY CodPT
) AS Q
ON R.CodPT = Q.CodPT
AND R.DataScadenza = Q.DataScadenza;
/* Seconda soluzione: analoga alla precedente ma basata su una CTE
Funziona con SQL Server 2005 e successivi
*/
WITH CTE_GetKey(CodPT, DataScadenza) AS
(
SELECT CodPT, MAX(DataScadenza)
FROM dbo.Rinnovi
GROUP BY CodPT
)
SELECT R.CodPT, R.DataScadenza, R.TipoRinnovo
FROM dbo.Rinnovi AS R
JOIN CTE_GetKey AS C
ON R.CodPT = C.CodPT
AND R.DataScadenza = C.DataScadenza;
/* Terza soluzione: tabella derivata basata sul ranking del partizionamento
Funziona con SQL Server 2005 e successivi
*/
WITH CTE_GetRank AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY CodPT ORDER BY DataScadenza DESC) AS RankCol
FROM dbo.Rinnovi
)
SELECT CodPT, DataScadenza, TipoRinnovo
FROM CTE_GetRank
WHERE RankCol = 1;
/* Quarta soluzione: Utilizzo della funzione FIRST_VALUE
Funziona con SQL Server 2012 e successivi
*/
SELECT DISTINCT
CodPT
, MAX(DataScadenza) OVER (PARTITION BY CodPT) AS DataScadenza
, FIRST_VALUE(TipoRinnovo) OVER (PARTITION BY CodPT ORDER BY DataScadenza DESC) AS TipoRinnovo
FROM dbo.Rinnovi;
/* Output:
CodPT DataScadenza TipoRinnovo
----------- ------------ ------------
1 2012-05-01 annuale
2 2012-11-18 test
3 2012-06-06 triennale
(3 row(s) affected)
*/
DROP TABLE dbo.Rinnovi;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/