Ето една бърза заявка за илюстриране на поведението:
изберете 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()