Выберите 10 по категориям и 10 случайных в подзапросе.
Расставьте приоритеты по категориям.
SELECT TOP 10 BookTitle, BookAuthor, BookCategory
FROM (
SELECT TOP 10 BookTitle, BookAuthor, BookCategory, 0 as prio
FROM TheTable
WHERE BookCategory LIKE 'Sale%')
UNION ALL
SELECT TOP 10 BookTitle, BookAuthor, BookCategory, 1 As prio
FROM TheTable
TABLESAMPLE (50 ROWS)
) x
ORDER BY prio
Я взял TABLESAMPLE
из ответа @ Remus, потому что это, очевидно, намного быстрее сбольшие столы.Голосуйте за него, если это главная особенность для вас.
Однако , я настроил его TABLESAMPLE (50 ROWS)
, из-за этого предупреждения в руководстве :
Фактическое количество строк, которыевозвращены могут значительно различаться.Если вы укажете небольшое число, например 5, вы можете не получить результаты в образце.
Я только что проверил и воспроизвел это.Я оставил TOP 10
дополнительно, потому что в конце концов нам нужно максимум 10.
Кроме того, руководство добавляет дискламер к «случайности»:
Если вам действительно нужна случайная выборка отдельных строк, измените запрос, чтобы отфильтровать строки случайным образом, вместо использования TABLESAMPLE.
Так что, если действительно случайные выборы являются требованием, ваш оригинал newid()
- правильный подход.