Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

LAST_VALUE in SQL Server 2012 restituisce risultati strani

SQL Server non conosce o non si preoccupa dell'ordine in cui le righe sono state inserite nella tabella. Se hai bisogno di un ordine specifico, usa sempre ORDER BY . Nel tuo esempio ORDER BY è ambiguo, a meno che tu non includa PK nel ORDER BY . Inoltre, LAST_VALUE la funzione può restituire risultati strani se non stai attento - vedi sotto.

Puoi ottenere il risultato atteso utilizzando MAX o LAST_VALUE (SQLFiddle ). Sono equivalenti in questo caso:

SELECT
    PK, Id1, Id2
    ,MAX(PK) OVER (PARTITION BY Id1, Id2) AS MaxValue
    ,LAST_VALUE(PK) OVER (PARTITION BY Id1, Id2 ORDER BY PK rows between unbounded preceding and unbounded following) AS LastValue
FROM
    Data
ORDER BY id1, id2, PK

Il risultato di questa query sarà lo stesso indipendentemente dall'ordine in cui le righe sono state originariamente inserite nella tabella. Puoi provare a inserire INSERT affermazioni in ordine diverso nel violino. Non influisce sul risultato.

Inoltre, LAST_VALUE non si comporta esattamente come ti aspetteresti intuitivamente con la finestra predefinita (quando hai solo ORDER BY nel OVER clausola). La finestra predefinita è ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW , mentre ti aspettavi che fosse ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING . Ecco una risposta SO con un buona spiegazione . Il collegamento a questa risposta SO è sulla pagina MSDN per LAST_VALUE . Quindi, una volta che la finestra di riga è specificata esplicitamente nella query, restituisce ciò che è necessario.

Se vuoi conoscere l'ordine in cui le righe sono state inserite nella tabella, penso che il modo più semplice sia usare IDENTITY . Quindi, la definizione della tua tabella cambierebbe in questo:

CREATE TABLE Data 
(PK INT IDENTITY(1,1) PRIMARY KEY,
Id1 INT,
Id2 INT)

Quando INSERT in questa tabella non è necessario specificare il valore per PK , il server lo genererebbe automaticamente. Garantisce che i valori generati siano univoci e in crescita (con parametro di incremento positivo), anche se si hanno più client che si inseriscono nella tabella contemporaneamente contemporaneamente. Potrebbero esserci delle lacune tra i valori generati, ma l'ordine relativo dei valori generati ti dirà quale riga è stata inserita dopo quale riga.