Aiuto!!! Sviluppo Query SQL

mercoledì 13 febbraio 2008 - 15.54

sacsacsac Profilo | Newbie

Ho un archivio "DATI" in questa maniera;

id codice data valore
1 0003 20/01/2007 13:40 -100
1 0003 20/01/2007 12:40 70 *
1 0003 20/01/2007 11:40 75
2 0005 20/01/2007 13:40 10 *
2 0005 20/01/2007 12:40 -100
2 0005 20/01/2007 11:40 54
3 0007 20/01/2007 13:40 -100
3 0007 20/01/2007 12:40 154 *
3 0007 20/01/2007 11:40 57
4 0010 20/01/2007 13:40 54 *
4 0010 20/01/2007 12:40 4545
4 0010 20/01/2007 11:40 54
4 0010 20/01/2007 10:40 54
5 0011 20/01/2007 13:40 2 *
6 0012 20/01/2007 13:40 -100
6 0012 20/01/2007 12:40 59 *
7 0013 20/01/2007 13:40 54 *
7 0013 20/01/2007 12:40 40

Devo costruire una query che mi restituisca un elenco di records
scartando il valore -100 e che restituisca una sola riga per codice in base al record con data più recente.
Con l'asterisco sono indicate le righe che mi aspetto che siano estratte!

Secondo voi come va scritta la query?

P.S.: consigliatemi pure un buon libro su SQL! grazie!

Grazie a tutti e ciao

lbenaglia Profilo | Guru

>Secondo voi come va scritta la query?

Ciao Carmine,

Hai dimeticato di segnalare quale DBMS stai utilizzando
Ti fornisco un esempio in Transact SQL per SQL Server:

USE tempdb; CREATE TABLE dbo.Dati( id int NOT NULL, codice char(4) NOT NULL, data smalldatetime NOT NULL, valore int NOT NULL ); INSERT dbo.Dati VALUES(1, '0003', '20070120 13:40', -100); INSERT dbo.Dati VALUES(1, '0003', '20070120 12:40', 70); INSERT dbo.Dati VALUES(1, '0003', '20070120 11:40', 75); INSERT dbo.Dati VALUES(2, '0005', '20070120 13:40', 10); INSERT dbo.Dati VALUES(2, '0005', '20070120 12:40', -100); INSERT dbo.Dati VALUES(2, '0005', '20070120 11:40', 54); INSERT dbo.Dati VALUES(3, '0007', '20070120 13:40', -100); INSERT dbo.Dati VALUES(3, '0007', '20070120 12:40', 154); INSERT dbo.Dati VALUES(3, '0007', '20070120 11:40', 57); INSERT dbo.Dati VALUES(4, '0010', '20070120 13:40', 54); INSERT dbo.Dati VALUES(4, '0010', '20070120 12:40', 4545); INSERT dbo.Dati VALUES(4, '0010', '20070120 11:40', 54); INSERT dbo.Dati VALUES(4, '0010', '20070120 10:40', 54); INSERT dbo.Dati VALUES(5, '0011', '20070120 13:40', 2); INSERT dbo.Dati VALUES(6, '0012', '20070120 13:40', -100); INSERT dbo.Dati VALUES(6, '0012', '20070120 12:40', 59); INSERT dbo.Dati VALUES(7, '0013', '20070120 13:40', 54); INSERT dbo.Dati VALUES(7, '0013', '20070120 12:40', 40); /* Soluzione per SQL Server 2005 basata su una CTE */ WITH CTE_GetKey AS ( SELECT id , codice , MAX(data) AS data FROM dbo.Dati WHERE valore <> -100 GROUP BY id, codice ) SELECT D.* FROM dbo.Dati AS D JOIN CTE_GetKey AS C ON D.id = C.id AND D.codice = C.codice AND D.data = C.data; /* Soluzione generica basata su una tabella derivata */ SELECT D.* FROM dbo.Dati AS D JOIN ( SELECT id , codice , MAX(data) AS data FROM dbo.Dati WHERE valore <> -100 GROUP BY id, codice ) AS C ON D.id = C.id AND D.codice = C.codice AND D.data = C.data; /* Output: id codice data valore ----------- ------ ----------------------- ----------- 1 0003 2007-01-20 12:40:00 70 2 0005 2007-01-20 13:40:00 10 3 0007 2007-01-20 12:40:00 154 4 0010 2007-01-20 13:40:00 54 5 0011 2007-01-20 13:40:00 2 6 0012 2007-01-20 12:40:00 59 7 0013 2007-01-20 13:40:00 54 (7 row(s) affected) */ DROP TABLE dbo.Dati;

>P.S.: consigliatemi pure un buon libro su SQL! grazie!
Anche qua, se ti riferisci a SQL Server puoi acquistare i libri dell'incredibile Itzik Ben-Gan:
http://www.sql.co.il/books/insidetsql2005/

>Grazie a tutti e ciao
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sacsacsac Profilo | Newbie

Ciao Lorenzo, grazie per la tua risposta.

Sto lavorando aimè in Access ... cmq provo e ti fò sapere!

....

Funziona!!!!

SELECT D.*
FROM Dati AS D
INNER JOIN (
SELECT
id
, codice
, MAX(dt) AS dt2
FROM Dati
WHERE valore <> -100
GROUP BY id, codice
) AS C
ON D.id = C.id
AND D.codice = C.codice
AND D.dt = C.dt2

Grazie infinite.

lbenaglia Profilo | Guru

>Sto lavorando aimè in Access ... cmq provo e ti fò sapere!

La soluzione basata sulla tabella derivata funziona anche con Access, avendo cura però di assegnare a MAX(data) un alias di colonna differente rispetto alla colonna base, altrimenti JET si arrabbia (anche se non ho mai capito il motivo ):

SELECT D.* FROM Dati AS D JOIN ( SELECT id , codice , MAX(data) AS dataUltima FROM Dati WHERE valore <> -100 GROUP BY id, codice ) AS C ON D.id = C.id AND D.codice = C.codice AND D.data = C.dataUltima;

>Grazie infinite.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5