Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

LAST_VALUE di SQL Server 2012 mengembalikan hasil yang aneh

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menerapkan Indikator Kinerja MS SQL Server Umum

  2. Ikhtisar Pernyataan PRINT di SQL Server

  3. Apa gunanya kursor di SQL Server?

  4. Buat Fungsi Bernilai Tabel di SQL Server

  5. Masukkan Gambar PictureBox ke dalam database Sql Server