Получить лучшие n записей по report_id - PullRequest
3 голосов
/ 01 июня 2010

У меня есть простое представление в моей базе данных MSSQL.Он состоит из следующих полей:

report_id INT
ym VARCHAR -- YYYY-MM
keyword VARCHAR(MAX)
visits INT

Я легко могу получить 10 самых популярных запросов по ключевым словам с помощью следующего запроса:

SELECT TOP 10 *
FROM top_keywords
WHERE ym BETWEEN '2010-05' AND '2010-05'
ORDER BY visits DESC

Теперь, где это сложно, я должен получитьпервые 10 записей для каждого report_id в заданном диапазоне дат (ym BETWEEN @start_date AND @end_date).

Как мне получить топ-10 для каждого report_id?Я сталкивался с предложениями, касающимися использования ROW_NUMBER () и RANK (), но их реализация не принесла больших результатов.

Ответы [ 3 ]

3 голосов
/ 01 июня 2010

Как насчет

SELECT *
FROM (SELECT *,
         ROW_NUMBER() OVER(PARTITION BY report_id ORDER BY (SELECT 0)) AS RN
         FROM top_keywords
         WHERE ym BETWEEN '2010-05' AND '2010-05') TK
WHERE RN <= 10
1 голос
/ 01 июня 2010

Не проверено (так как у меня нет установки mssql дома), но это должно быть близко ...

with IDs (ID) as (
  select
    report_id
  from
    top_keywords tk
  where
    tk.ym between @start_date and @end_date
    and row_number() over(partition by report_id order by visits desc) <= 10
)
  select
    top.*
  from
    top_keywords top
    join IDs on IDs.ID = top.report_id
0 голосов
/ 01 июня 2010

Вы хотите сделать один запрос или серию запросов? Для серии запросов вы можете

  • Шаг 1) Найти все уникальные идентификаторы отчетов
  • Шаг 2) Используйте запрос выше для верхней 10 за этот отчет

Или вы действительно хотите гигантский запрос, который даст вам все результаты? Сколько результатов вы хотите, 10 на идентификатор отчета?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...