Выберите 10 лучших записей для каждой категории - PullRequest
183 голосов
/ 07 октября 2008

Я хочу вернуть 10 лучших записей из каждого раздела в одном запросе. Может кто-нибудь помочь с тем, как это сделать? Раздел является одним из столбцов в таблице.

База данных - SQL Server 2005. Я хочу вернуть первые 10 по введенной дате. Разделы бизнес, локальные и тематические. Для одной конкретной даты мне нужны только верхние (10) бизнес-строк (самая последняя запись), верхние (10) локальные строки и верхние (10) объекты.

Ответы [ 14 ]

4 голосов
/ 07 октября 2008

Может ли оператор UNION работать на вас? Сделайте один SELECT для каждого раздела, затем объедините их вместе. Думаю, это будет работать только для фиксированного числа секций.

3 голосов
/ 01 февраля 2013

Если вы хотите произвести вывод, сгруппированный по разделам, отображая только верхние n записи из каждого раздела примерно так:

SECTION     SUBSECTION

deer        American Elk/Wapiti
deer        Chinese Water Deer
dog         Cocker Spaniel
dog         German Shephard
horse       Appaloosa
horse       Morgan

... тогда следующее должно работать довольно широко со всеми базами данных SQL. Если вы хотите 10 лучших, просто измените 2 на 10 в конце запроса.

select
    x1.section
    , x1.subsection
from example x1
where
    (
    select count(*)
    from example x2
    where x2.section = x1.section
    and x2.subsection <= x1.subsection
    ) <= 2
order by section, subsection;

Для настройки:

create table example ( id int, section varchar(25), subsection varchar(25) );

insert into example select 0, 'dog', 'Labrador Retriever';
insert into example select 1, 'deer', 'Whitetail';
insert into example select 2, 'horse', 'Morgan';
insert into example select 3, 'horse', 'Tarpan';
insert into example select 4, 'deer', 'Row';
insert into example select 5, 'horse', 'Appaloosa';
insert into example select 6, 'dog', 'German Shephard';
insert into example select 7, 'horse', 'Thoroughbred';
insert into example select 8, 'dog', 'Mutt';
insert into example select 9, 'horse', 'Welara Pony';
insert into example select 10, 'dog', 'Cocker Spaniel';
insert into example select 11, 'deer', 'American Elk/Wapiti';
insert into example select 12, 'horse', 'Shetland Pony';
insert into example select 13, 'deer', 'Chinese Water Deer';
insert into example select 14, 'deer', 'Fallow';
2 голосов
/ 14 мая 2018

Хотя вопрос был о SQL Server 2005, большинство людей пошли дальше, и если они найдут этот вопрос, что может быть предпочтительным ответом в других ситуациях, это один с использованием CROSS APPLY, как показано в этом сообщении в блоге .

SELECT *
FROM t
CROSS APPLY (
  SELECT TOP 10 u.*
  FROM u
  WHERE u.t_id = t.t_id
  ORDER BY u.something DESC
) u

Этот запрос включает 2 таблицы. Запрос OP включает только 1 таблицу, в случае которой решение на основе оконной функции может быть более эффективным.

1 голос
/ 26 января 2017

Вы можете попробовать этот подход. Этот запрос возвращает 10 самых населенных городов для каждой страны.

   SELECT city, country, population
   FROM
   (SELECT city, country, population, 
   @country_rank := IF(@current_country = country, @country_rank + 1, 1) AS country_rank,
   @current_country := country 
   FROM cities
   ORDER BY country, population DESC
   ) ranked
   WHERE country_rank <= 10;
...