Вот что я бы, вероятно, сделал бы следующим образом:
WITH ranked AS (
SELECT
val1,
val2,
ct,
rank = ROW_NUMBER() OVER (PARTITION BY val1 ORDER BY val2)
FROM table
)
SELECT
r.val1,
r.val2,
avg_ct = AVG(r2.ct)
FROM ranked r
INNER JOIN ranked r2 ON r2.val1 = r.val1
AND r2.rank BETWEEN r.rank - 6 AND r.rank
GROUP BY r.val1, r.val2
Определенно, не такой элегантный и лаконичный, как версия Sybase, но, как по мне, тоже не так уж и плохо.