Khi bạn thêm một order by
thành một tổng hợp được sử dụng như một hàm cửa sổ mà tổng hợp đó biến thành một "số lượng đang chạy" (hoặc bất kỳ tổng hợp nào bạn sử dụng).
count(*)
sẽ trả về số lượng hàng cho đến "hàng hiện tại" dựa trên thứ tự được chỉ định.
Truy vấn sau đây hiển thị các kết quả khác nhau cho các tổng hợp được sử dụng với một đơn đặt hàng order by
. Với sum()
thay vì count()
nó dễ nhìn hơn một chút (theo ý kiến của tôi).
with test (id, num, x) as (
values
(1, 4, 1),
(2, 4, 1),
(3, 5, 2),
(4, 6, 2)
)
select id,
num,
x,
count(*) over () as total_rows,
count(*) over (order by id) as rows_upto,
count(*) over (partition by x order by id) as rows_per_x,
sum(num) over (partition by x) as total_for_x,
sum(num) over (order by id) as sum_upto,
sum(num) over (partition by x order by id) as sum_for_x_upto
from test;
sẽ dẫn đến:
id | num | x | total_rows | rows_upto | rows_per_x | total_for_x | sum_upto | sum_for_x_upto
---+-----+---+------------+-----------+------------+-------------+----------+---------------
1 | 4 | 1 | 4 | 1 | 1 | 8 | 4 | 4
2 | 4 | 1 | 4 | 2 | 2 | 8 | 8 | 8
3 | 5 | 2 | 4 | 3 | 1 | 11 | 13 | 5
4 | 6 | 2 | 4 | 4 | 2 | 11 | 19 | 11
Có nhiều ví dụ hơn trong hướng dẫn Postgres