PDA

View Full Version : [SQL-SERVER] Query ricrosiva con


MAURIZIO81
09-04-2011, 11:54
Ciao a tutti ragazzi.

ANZITUTTO VI CHIEDO SCUSA MA HO SBAGLIATO IL TITOLO PREMENDO INVIO INVOLONTARIAMENTE

VOLEVO SCRIVERE: [SQL-SERVER] Query ricorsiva con Date Chiusura

Parto subito con un esempio per spiegarvi cosa intendo realizzare.

Ho una tabella cosi strutturata:

Nome Istituto Conto DataInserimento IDGRP Riferimento
A B C 01/01/2010 1 XX
A B C 01/01/2010 2 XX
A B C 02/01/2010 7 XX
A B C 03/01/2010 1 XX
F G H 02/01/2010 5 XX
L M N 01/01/2010 5 XX
L M N 02/01/2010 5 XX
L M N 02/01/2010 8 XX

Vorrei realizzare qualcosa del genere:

Nome Istituto Conto DataInserimento IDGRP Riferimento
A B C 01/01/2010 1 01/01/2010
A B C 01/01/2010 2 02/01/2010
A B C 02/01/2010 7 03/01/2010
A B C 03/01/2010 1 LAST
F G H 02/01/2010 5 LAST
L M N 31/12/2009 5 01/01/2010
L M N 01/01/2010 5 02/01/2010
L M N 02/01/2010 5 02/01/2010
L M N 02/01/2010 8 LAST

In altre parole vorrei "marchiare" con un flag, in tal caso indicato con "LAST", il record piu recente con Nome, Istituo e Conto come parte in comune, facendo attenzione che nel caso in cui siano presenti due record uguali con stessa data (nell'esempio gli ultimi due record), ad essere contraddistinto con il flag "LAST" dovrebbe essere quello con IDGRP maggiore.

Tutti gli altri record invece devono essere riempiti con la data di Inserimento del record che li SUCCEDE e con DATA_INSERIMENTO PIU VICINA a quello da flaggare. Va fatta quindi attenzione a casi come il quart'ultimo record dell'esempio, che conterrą come Riferimento la data di inserimento del record con data Inserimento 01/01/2010, e non per esempio quello del 02/01/2010.

Grazie mille a tutti coloro i quali sapranno aiutarmi.

MAURIZIO81
11-04-2011, 07:14
Nessuno?

gugoXX
11-04-2011, 18:27
C'e' un errore
A B C 01/01/2010 1 02/01/2010

Perche' 2/1/2010 and not

A B C 01/01/2010 1 01/01/2010

essendo che il record che lo succede ha proprio 1/1/2010 ?

MAURIZIO81
11-04-2011, 21:08
Hai ragione...

CORRETTO.

Come faccio a realizzare cio che voglio???

gugoXX
12-04-2011, 15:40
Proverei con qualcosa come
(Ne' compilato ne' tantomeno testato)


WITH VS_tmpord
AS (SELECT Nome,Istituto,Conto,DataInserimento,IDGRP,
ROW_NUMBER() OVER (ORDER BY ome,Istituto,Conto,DataInserimento,IDGRP) rn
FROM tabella)
SELECT NOME, Istituto, Conto, DataInserimento, IDGRP,
(SELECT DataInserimento from vs_tmpord invs
WHERE invs.Nome=outvs.Nome
AND invs.Istituto = outvs.Istituto
AND invs.Conto = outvs.Conto
AND invs.rn=outvs.rn+1) as Riferimento
FROM vs_tmpord outvs


Da condire mettendo il "LAST" dove il riferimento e' NULL, ma non ne ho voglia.