sql >> Databasteknik >  >> RDS >> Sqlserver

LAST_VALUE i SQL Server 2012 ger konstiga resultat

SQL Server känner inte till eller bryr sig inte om i vilken ordning raderna infogades i tabellen. Om du behöver en specifik beställning, använd alltid ORDER BY . I ditt exempel ORDER BY är tvetydig, såvida du inte inkluderar PK i ORDER BY . Dessutom LAST_VALUE funktion kan returnera udda resultat om du inte är försiktig - se nedan.

Du kan få ditt förväntade resultat med MAX eller LAST_VALUE (SQLFiddle ). De är likvärdiga i det här fallet:

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

Resultatet av denna fråga blir detsamma oavsett i vilken ordning raderna ursprungligen infogades i tabellen. Du kan försöka lägga in INSERT uttalanden i olika ordning i fiolen. Det påverkar inte resultatet.

Även LAST_VALUE beter sig inte riktigt som du intuitivt förväntar dig med standardfönstret (när du bara har ORDER BY i ÖVER klausul). Standardfönstret är RADER MELLAN OBEGRÄNSAD FÖREGÅENDE OCH AKTUELL RAD , medan du hade förväntat dig att det skulle vara RADER MELLAN OBEGRÄNSAT FÖREGÅENDE OCH OBEGRÄNSAT FÖLJANDE . Här är ett SO-svar med en bra förklaring . Länken till detta SO-svar finns på MSDN-sidan för LAST_VALUE . Så när radfönstret har specificerats explicit i frågan returnerar det det som behövs.

Om du vill veta i vilken ordning raderna infogades i tabellen tror jag det enklaste sättet är att använda IDENTITET . Så definitionen av din tabell skulle ändras till detta:

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

När du INSERT i den här tabellen behöver du inte ange värdet för PK , skulle servern generera det automatiskt. Det garanterar att genererade värden är unika och växer (med positiv inkrementparameter), även om du har många klienter som infogar i tabellen samtidigt. Det kan finnas luckor mellan genererade värden, men den relativa ordningen för de genererade värdena visar vilken rad som infogades efter vilken rad.



  1. Hur ställer du in 0 med MAX-funktionen när den är NULL?

  2. wp-admin kan inte komma åt efter flyttning

  3. Vad är skillnaden mellan UNIQUE, UNIQUE KEY och CONSTRAINT 'name' UNIQUE?

  4. Android Room Library kan inte kopiera databasen från tillgången