Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL:Last_Value() връща грешен резултат (но First_Value() работи добре)

Ето една бърза заявка за илюстриране на поведението:

изберете v, -- FIRST_VALUE() и LAST_VALUE() first_value(v) над (подреждане по v) f1, first_value(v) над (подреждане по v редове между неограничен предходен и текущия ред) f2, първа_стойност (v) над (подреждане по v редове между неограничен предходен и неограничен следващ) f3, last_value (v) над (подреждане по v) l1, last_value (v) над (подреждане по v редове между неограничен предходен и текущ ред) l2, последна_стойност (v) над (подреждане по v редове между неограничен предходен и неограничен следващ) l3, -- За пълнота нека сравним горното с MAX() max (v) над () m1, max (v) над (порядък) по v) m2, макс. (v) над (подреждане по v редове между неограничен предходен и текущ ред) m3, макс. (v) над (подреждане по v редове между неограничен предходен и неограничен следващ) m4from (стойности(1),(2) ),(3),(4)) t(v) 

Резултатът от горната заявка може да се види тук (SQLFiddle тук ):

<предварителен код>| 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 |

Малко хора мислят за имплицитните рамки, които се прилагат към прозоречни функции, които приемат ORDER BY клауза. В този случай прозорците са по подразбиране към рамката RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW . (RANGE не е точно същото като ROWS, но това е друга история). Помислете за това по следния начин:

  • На реда с v =1 рамката на подредения прозорец обхваща v IN (1)
  • На реда с v =2 рамката на подредения прозорец обхваща v IN (1, 2)
  • На реда с v =3 рамката на подредения прозорец обхваща v IN (1, 2, 3)
  • На реда с v =4 рамката на подредения прозорец обхваща v IN (1, 2, 3, 4)

Ако искате да предотвратите това поведение, имате две възможности:

  • Използвайте изричен РЕДОВЕ МЕЖДУ НЕОГРАНИЧЕНО ПРЕДИШНО И НЕОГРАНИЧЕНО СЛЕДВАЩО клауза за поръчан функции на прозорец
  • Не използвайте ПОРЪЧАЙТЕ ПО клауза в тези прозоречни функции, които позволяват пропускането им (като MAX(v) OVER() )

Повече подробности са обяснени в тази статия за LEAD() , LAG() , FIRST_VALUE() и 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. Decimal се предава неправилно от C# към SQL Server с TableAdapters

  2. Има ли голяма техническа разлика между типовете данни VARBINARY(MAX) и IMAGE?

  3. Как да приложа 3 стойности за 1 ред към 3 реда с всяка стойност?

  4. Сортиране на първичен ключ

  5. Как да промените колона от Null на Not Null в SQL Server