select
"date",
shop_id,
amount,
extract(dow from date),
case when
row_number() over (order by date) > 3
then
avg(amount) OVER (
ORDER BY date DESC
ROWS BETWEEN 1 following AND 3 FOLLOWING
)
else null end
from (
select *
from ro
where extract(dow from date) = 4
) s
Điều gì sai với truy vấn của OP là đặc tả khung:
ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING
Ngoài ra, truy vấn của tôi tránh tính toán không cần thiết bằng cách lọc các ngày Thứ Năm trước khi áp dụng các hàm cửa sổ đắt tiền.
Nếu cần phân vùng theo shop_id thì rõ ràng thêm phân vùng partition by shop_id
cho cả hai chức năng, avg
và row_number
.