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

SQL:Last_Value() mengembalikan hasil yang salah (tetapi First_Value() berfungsi dengan baik)

Berikut kueri cepat untuk mengilustrasikan perilaku tersebut:

select 
  v,

  -- FIRST_VALUE() and LAST_VALUE()
  first_value(v) over(order by v) f1,
  first_value(v) over(order by v rows between unbounded preceding and current row) f2,
  first_value(v) over(order by v rows between unbounded preceding and unbounded following) f3,
  last_value (v) over(order by v) l1,
  last_value (v) over(order by v rows between unbounded preceding and current row) l2,
  last_value (v) over(order by v rows between unbounded preceding and unbounded following) l3,

  -- For completeness' sake, let's also compare the above with MAX()
  max        (v) over() m1,
  max        (v) over(order by v) m2,
  max        (v) over(order by v rows between unbounded preceding and current row) m3,
  max        (v) over(order by v rows between unbounded preceding and unbounded following) m4
from (values(1),(2),(3),(4)) t(v)

Output dari query di atas dapat dilihat di sini (SQLFiddle here ):

| V | F1 | F2 | F3 | L1 | L2 | L3 | M1 | M2 | M3 | M4 |
|---|----|----|----|----|----|----|----|----|----|----|
| 1 |  1 |  1 |  1 |  1 |  1 |  4 |  4 |  1 |  1 |  4 |
| 2 |  1 |  1 |  1 |  2 |  2 |  4 |  4 |  2 |  2 |  4 |
| 3 |  1 |  1 |  1 |  3 |  3 |  4 |  4 |  3 |  3 |  4 |
| 4 |  1 |  1 |  1 |  4 |  4 |  4 |  4 |  4 |  4 |  4 |

Hanya sedikit orang yang memikirkan frame implisit yang diterapkan ke fungsi jendela yang mengambil ORDER BY ayat. Dalam hal ini, windows default ke frame RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW . (RANGE tidak persis sama dengan ROWS, tapi itu cerita lain). Pikirkan seperti ini:

  • Pada baris dengan v = 1 bingkai jendela yang dipesan membentang v IN (1)
  • Pada baris dengan v = 2 bingkai jendela yang dipesan membentang v IN (1, 2)
  • Pada baris dengan v = 3 bingkai jendela yang dipesan membentang v IN (1, 2, 3)
  • Pada baris dengan v = 4 bingkai jendela yang dipesan membentang v IN (1, 2, 3, 4)

Jika Anda ingin mencegah perilaku tersebut, Anda memiliki dua opsi:

  • Gunakan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING klausa untuk dipesan fungsi jendela
  • Tidak menggunakan ORDER BY klausa dalam fungsi-fungsi jendela yang memungkinkan untuk menghilangkannya (sebagai MAX(v) OVER() )

Detail lebih lanjut dijelaskan di artikel ini tentang LEAD() , LAG() , FIRST_VALUE() dan LAST_VALUE()



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di mana menggunakan Aplikasi Luar

  2. kueri rekursif t-sql

  3. Bagaimana cara membatasi pengguna untuk mengakses objek hanya dari satu skema di SQL Server 2008?

  4. Bagaimana cara mengabaikan tag html di Sql Server 2008 Pencarian Teks Lengkap

  5. Di tsql, apakah Sisipkan dengan pernyataan Pilih aman dalam hal konkurensi?