Dưới đây là một truy vấn nhanh để minh họa cho hành vi:
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)
Kết quả của các truy vấn trên có thể được nhìn thấy ở đây (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 |
Rất ít người nghĩ đến những khung ngầm rằng là áp dụng cho các chức năng cửa sổ có mệnh đề là ORDER BY
. Trong trường hợp này, các cửa sổ được mặc định là khung RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. (RANGE không chính xác giống như ROWS, nhưng đó là một câu chuyện khác).Hãy suy nghĩ về nó theo cách này:
- Trên hàng với
v = 1
khung cửa sổ lệnh của nhịp v IN (1)
- Trên hàng với
v = 2
khung cửa sổ lệnh của nhịp v IN (1, 2)
- Trên hàng với
v = 3
nhịp khung cửa sổ lệnh của v IN (1, 2, 3)
- Trên hàng có
v = 4
khoảng cách khung cửa sổ đã đặt hàng v IN (1, 2, 3, 4)
Nếu bạn muốn ngăn chặn hành vi đó, bạn có hai lựa chọn:
- Sử dụng một rõ ràng
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
khoản cho ra lệnh chức năng cửa sổ
- Sử dụng không
ORDER BY
điều khoản trong những chức năng cửa sổ cho phép bỏ qua chúng (như MAX(v) OVER()
)
Thông tin chi tiết được giải thích trong this article about LEAD()
, LAG()
, FIRST_VALUE()
and LAST_VALUE()
Nguồn
2014-11-07 17:09:05
Cảm ơn bạn rất nhiều! Không chỉ giải quyết vấn đề mà còn cho tôi biết lý do tại sao. Tôi đã duyệt qua bài đăng được liên kết trước đó nhưng không nghĩ về cơ chế phân vùng. – Echo