Я бы просто указал пороги в виде строк, чтобы их было легче объединить.
DECLARE @t TABLE (category int, val int, data varchar(10));
INSERT INTO @t VALUES
(1, 1, 'foo'),
(1, 3, 'bar'),
(1, 4, 'baz'),
(2, 2, 'quz'),
(2, 5, 'wibble'),
(2, 6, 'wobble'),
(2, 8, 'ham'),
(2, 12, 'spam'),
(3, 1, 'eggs');
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY threshold, category ORDER BY val DESC) AS rn
FROM (VALUES
(5),
(10)
) thresholds(threshold)
JOIN @t AS t ON val <= threshold
) AS x
WHERE rn = 1
ORDER BY threshold, category
Если предложение (VAULES ...)
недоступно, вы можете просто использовать FROM (SELECT 5 AS threshold UNION ALL SELECT 10) thresholds
.