SQL Server tidak tahu atau peduli tentang urutan baris yang dimasukkan ke dalam tabel. Jika Anda membutuhkan pesanan tertentu, selalu gunakan ORDER BY
. Dalam contoh Anda ORDER BY
ambigu, kecuali jika Anda menyertakan PK
ke dalam ORDER BY
. Selain itu, LAST_VALUE
fungsi dapat mengembalikan hasil ganjil jika Anda tidak hati-hati - lihat di bawah.
Anda bisa mendapatkan hasil yang diharapkan menggunakan MAX
atau LAST_VALUE
(SQLFiddle
). Mereka setara dalam hal ini:
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
Hasil kueri ini akan sama terlepas dari urutan baris yang awalnya dimasukkan ke dalam tabel. Anda dapat mencoba memasukkan INSERT
pernyataan dalam urutan yang berbeda dalam biola. Itu tidak mempengaruhi hasil.
Juga, LAST_VALUE
berperilaku tidak seperti yang Anda harapkan secara intuitif dengan jendela default (ketika Anda baru saja ORDER BY
di OVER
ayat). Jendela default adalah ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
, sementara Anda mengharapkannya menjadi ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
. Inilah jawaban SO dengan penjelasan yang bagus
. Tautan ke jawaban SO ini ada di halaman MSDN untuk LAST_VALUE
. Jadi, setelah jendela baris ditentukan secara eksplisit dalam kueri, ia mengembalikan apa yang dibutuhkan.
Jika Anda ingin mengetahui urutan baris yang dimasukkan ke dalam tabel, menurut saya, cara paling sederhana adalah menggunakan IDENTITY
. Jadi, definisi tabel Anda akan berubah menjadi ini:
CREATE TABLE Data
(PK INT IDENTITY(1,1) PRIMARY KEY,
Id1 INT,
Id2 INT)
Saat Anda INSERT
ke dalam tabel ini Anda tidak perlu menentukan nilai untuk PK
, server akan membuatnya secara otomatis. Ini menjamin bahwa nilai yang dihasilkan unik dan berkembang (dengan parameter kenaikan positif), bahkan jika Anda memiliki banyak klien yang memasukkan ke dalam tabel secara bersamaan. Mungkin ada kesenjangan antara nilai yang dihasilkan, tetapi urutan relatif dari nilai yang dihasilkan akan memberi tahu Anda baris mana yang dimasukkan setelah baris mana.