>Vorrei che mi ritornasse solo l'ultimo orario piu vicino a quello
>attuale per ogni dipendente, e quindi:
>
>NOME COGNOME MATRICOLA ORA_ARRIVO
>mario rossi 0010
>23:35
>francesco verdi 0020
>22:20
>carlo bianchi 0030
>19:00
>
>Qualche aiuto?
Ciao Giuseppe,
Ti allego un paio di esempi realizzati con SQL Server 2008 che dovrebbero essere compatibili con la tua versione di Oracle (non so se sono presenti le CTE nella 9i):
USE tempdb;
CREATE TABLE dbo.foo(
Nome varchar(10) NOT NULL,
Cognome varchar(10) NOT NULL,
Matricola char(4) NOT NULL,
OraArrivo time(0) NOT NULL
);
INSERT dbo.foo
VALUES ('mario', 'rossi', '0010', '23:30')
, ('francesco', 'verdi', '0020', '12:23')
, ('carlo', 'bianchi', '0030', '10:12')
, ('mario', 'rossi', '0010', '11:30')
, ('carlo', 'bianchi', '0030', '19:00')
, ('francesco', 'verdi', '0020', '22:20')
, ('mario', 'rossi', '0010', '23:35');
/* Soluzione 1: utilizzo una Common Table Expression */
WITH CTE_GetKey(Matricola, OraArrivo) AS
(
SELECT Matricola, MAX(OraArrivo)
FROM dbo.foo
GROUP BY Matricola
)
SELECT F.*
FROM dbo.foo AS F
JOIN CTE_GetKey AS K
ON F.Matricola = K.Matricola
AND F.OraArrivo = K.OraArrivo;
/* Soluzione 2: utilizzo la classica tabella derivata */
SELECT F.*
FROM dbo.foo AS F
JOIN (
SELECT Matricola, MAX(OraArrivo) AS OraArrivo
FROM dbo.foo
GROUP BY Matricola
) AS K
ON F.Matricola = K.Matricola
AND F.OraArrivo = K.OraArrivo;
/* Output:
Nome Cognome Matricola OraArrivo
---------- ---------- --------- ----------------
carlo bianchi 0030 19:00:00
francesco verdi 0020 22:20:00
mario rossi 0010 23:35:00
(3 row(s) affected)
*/
DROP TABLE dbo.foo;
>Grazie anticipatamente :)
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/