Aggiornamento Valori con verifica Parametri

di il
21 risposte

Aggiornamento Valori con verifica Parametri

Ciao a tutti e ben trovati, intanto grazie a tutti per il supporto, ho un problema che non riesco a risolvere e che vi sottopongo:

Ciao a tutti, ho un problema e non riesco a venirne fuori.

Questa la mia tabella di test:


call_id num_progressivo codice ValoreAtteso
202111 1 5110
202111 2 5110
202111 3 5110
202111 4 8220
202111 5 5110 8220 <-- devo aggiornare il 5110 col valore precedente
202111 6 8220
202112 1 1021
202112 2 1020 1021 <-- devo aggiornare il 1020 col valore precedente
202112 3 1021

Per ogni callid ho un ordinamento e dei codici.

Ma il codice deve essere univoco e non può essere ripetuto all'interno della colonna e rispettare l'ordinamento :
devo capire quelle da aggiornare e aggiornarlo col valore precedente quando il codice successivo al precedente è nuovo, ossia non posso avere codice come posso fare a risolvere?



Grazie mille

21 Risposte

  • Re: Aggiornamento Valori con verifica Parametri

    thepseud ha scritto:


    ....
    ossia non posso avere codice
    ....
    Grazie mille
    cioè ? che significa di preciso ?
    puoi usare stored procedure ?
  • Re: Aggiornamento Valori con verifica Parametri

    MI hanno detto che meglio di no, però potrei utilizzarla , ma sono uno junior, come potrei fare con una stored procedure?

    Grazie mille
  • Re: Aggiornamento Valori con verifica Parametri

    Con questa riesco ad aggiornare il record se l'anomalia nei dati della colonna codice è dovuta ad un valore minore rispetto al precedente una anomalia alla volta all'interno del range call_id e progressivo

    SELECT
    call_id
    ,num_progressivo
    ,codice
    ,[codice - 1] = LAG(codice, 1, codice) OVER (PARTITION BY call_id ORDER BY num_progressivo)
    ,valore_atteso
    ,CASE
    WHEN codice > LAG(codice, 1, codice) OVER (PARTITION BY call_id ORDER BY num_progressivo) THEN codice
    ELSE LAG(codice, 1, codice) OVER (PARTITION BY call_id ORDER BY num_progressivo)
    END AS risultato
    FROM
    dbo.calls;

    Però come faccio a controllare se poi il record successivo è minore?

    Anche la sotred procedure potrebbe andare bene...
  • Re: Aggiornamento Valori con verifica Parametri

    thepseud ha scritto:


    ...
    Però come faccio a controllare se poi il record successivo è minore?
    ...
    Ciao,
    non sono sicuro di aver capito tutto, ma così ... a naso :

    visto che hai usato LAG per leggere il codice precedente
    usa LEAD per leggere anche il successivo

    https://docs.microsoft.com/it-it/sql/t-sql/functions/lead-transact-sql?view=sql-server-ver15

    HTH
  • Re: Aggiornamento Valori con verifica Parametri

    Buongiorno si , ma non funziona proprio bene

    Help me please
  • Re: Aggiornamento Valori con verifica Parametri

    thepseud ha scritto:


    Buongiorno si , ma non funziona proprio bene
    Abbi pazienza, ma dubito che non funzioni, forse la usi in modo sbagliato.

    Concordo con sspintux.
  • Re: Aggiornamento Valori con verifica Parametri

    MI potete dare una mano? ci sto combattendo da un pò ...anche con una stored procedure se meglio

    Grazie mille
  • Re: Aggiornamento Valori con verifica Parametri

    'Conditio sine qua non' per poterti aiutare è spiegare dettagliatamente la logica da applicare;

    Spiega tutto in modo più chiaro possibile e dicci anche perchè LEAD non va bene
    facendo esempi significativi


    P.S. (scherzoso ... ma non troppo)
    rileggendo la tua query , in particolare la parte
    ,[codice - 1] = LAG(codice, 1, codice) OVER (PARTITION BY call_id ORDER BY num_progressivo)
    e visto che dici
    ... sono uno junior
    sappi che la punizione per chi assegna ad un alias di campo un nome come [codice-1]
    è la gogna al centro del piazzale
  • Re: Aggiornamento Valori con verifica Parametri

    Ok ci provo in modo dettagliato:

    "...sappi che la punizione per chi assegna ad un alias di campo un nome come [codice-1]
    è la gogna al centro del piazzale " ..era per farvi capire ...


    Riprendo sempre la mia tabella, che potrebbe avere altri codici chiaramente:

    call_id num_progressivo codice ValoreAtteso
    202111 1 5110
    202111 2 5110
    202111 3 5110
    202111 4 8220
    202111 5 5110 8220 <-- devo aggiornare il 5110 col valore precedente (8210)
    202111 6 8220
    202112 1 1021
    202112 2 1020 1021 <-- devo aggiornare il 1020 col valore precedente (1021)
    202112 3 1021

    Partiamo da un assioma : ogni codice è univoco e non può essere ripetuto nell'ordinamento (num_progressivo)

    Partendo dal primo codice , in questo caso 5110 con num_progresso = 1 verifico il record successivo, se anche
    questo codice è uguale passo a quello dopo, ossia quello con num_progressivo = 2.

    Se invece il record successivo cambia , nel mio caso ho codice 8220 : un codice nuovo , verifico il record successivo
    se uguale a 5110 lo devo aggiornare con 8220 , perchè come dicevo prima è un errore e quando un codice è nuovo nella sequenza successiva non può essere ripetuto : è univoco.

    Se ancora quello successivo è uguale a 8220, va bene e passo al successivo e così via.


    Spero di essere stato chiaro e grazie per l'aiuto vi ringrazio veramente ...
  • Re: Aggiornamento Valori con verifica Parametri

    thepseud ha scritto:


    Ok ci provo in modo dettagliato:
    Manca la parte più importante: la query!
  • Re: Aggiornamento Valori con verifica Parametri

    Che rinco :


    Eccola


    select *
    from
    (
    select
    row_number() over (order by T.call_id, T.NUM_PROGRESSIVO ) AS RID
    ,T.call_id, T.NUM_PROGRESSIVO, T.CODICE,
    lag(T.CODICE) over (partition by T.CALL_ID order by T.NUM_PROGRESSIVO) as APP1,
    lead(T.CODICE) over (partition by T.CALL_ID order by T.NUM_PROGRESSIVO) as APP2
    from test T
    ) T1
    where APP1 = APP2
    and CODICE != APP1


    Mio output attuale :

    RID Codice NUM Codice APP1 APP2
    4 202111 4 8220 5110 5110 --> questo non lo dovrebbe prendere
    5 202111 5 5110 8220 8220
    8 202112 2 1020 1021 1021
  • Re: Aggiornamento Valori con verifica Parametri

    Ho fatto una cosa del genere e sembra funzionare :


    with OrdineinTabella as (

    select
    call_id
    , num_progressivo
    , codice
    from test2

    )
    , OrdineSuccessivodiUno as (

    select
    call_id
    , num_progressivo
    , codice
    , LEAD(codice ) OVER ( partition by call_id ORDER BY num_progressivo ) CodiceSuccessivodiUno
    , LEAD(num_progressivo) OVER ( partition by call_id ORDER BY num_progressivo ) AS num_progressivoDopo
    from test2

    )
    , OrdineSuccessivodiDue as (

    select
    call_id
    , num_progressivo
    , codice
    , LEAD(codice,2) OVER ( partition by call_id ORDER BY num_progressivo ) CodiceSuccessivodiDue
    , LEAD(num_progressivo,2) OVER ( partition by call_id ORDER BY num_progressivo ) AS num_progressivodiDue
    from test

    )

    select
    a.num_progressivo as num_progrreale
    , a.codice as codicereale
    , b.CodiceSuccessivodiUno
    , c.CodiceSuccessivodiDue

    from OrdineinTabella a
    INNER JOIN OrdineSuccessivodiUno b on (a.call_id = b.call_id and a.num_progressivo = b.num_progressivo)
    INNER JOIN OrdineSuccessivodiDue c on (b.call_id = c.call_id and b.num_progressivo = c.num_progressivo)
    WHERE
    CodiceSuccessivodiUno != a.codice AND c.CodiceSuccessivodiDue is null
  • Re: Aggiornamento Valori con verifica Parametri

    Se ti funziona ... bravo!,

    altrimenti in caso di problemi ,andrei di stored procedure in cui puoi:

    - usare variabili ( anche di tipo TABLE)
    https://www.sqlshack.com/sql-variables-basics-and-usage/

    - usare cursori ( anche se è meglio farne a meno quando possibile)
    https://docs.microsoft.com/it-it/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-ver15
    (N.B. occhio al close e deallocate)

    eseguire tutte le operazioni insert/update/delete
  • Re: Aggiornamento Valori con verifica Parametri

    Grazie...speriamo ma xk secondo te è concettualmente sbagliata?, vi farò sapere, per la procedura come la imposto però?

    Faccio due cursori? il primo prende i codice e il secondo li verifica? Non saprei sai?

    Ragazzi Grazie mille per il supporto
Devi accedere o registrarti per scrivere nel forum
21 risposte