Если вы хотите, чтобы последние 10 календарных дней с момента продажи товаров:
SELECT product_id, AVG(sales)
FROM table t
JOIN (
SELECT product_id, MAX(sales_date) as max_sales_date
FROM table
GROUP BY product_id
) t_max ON t.product_id = t_max.product_id
AND DATEDIFF(day, t.sales_date, t_max.max_sales_date) < 10
GROUP BY product_id;
Разница в датах зависит от сервера SQL, вам нужно заменить ее синтаксисом сервера для функций разницы дат.
Чтобы получить последние 10 дней, когда товар продавался:
SELECT product_id, AVG(sales)
FROM (
SELECT product_id, sales, DENSE_RANK() OVER
(PARTITION BY product_id ORDER BY sales_date DESC) AS rn
FROM Table
) As t_rn
WHERE rn <= 10
GROUP BY product_id;
Это означает, что sales_date - это дата, а не дата / время. Вам придется извлечь часть даты, если поле имеет дату и время.
И, наконец, бесплатная версия оконной функции:
SELECT product_id, AVG(sales)
FROM Table t
WHERE sales_date IN (
SELECT TOP(10) sales_date
FROM Table s
WHERE t.product_id = s.product_id
ORDER BY sales_date DESC)
GROUP BY product_id;
Опять же, sales_date считается датой, а не датой и временем. Используйте другой ограничивающий синтаксис, если TOP не поддерживается вашим сервером.