Дальнейшая фильтрация результатов SQL

У меня есть запрос, который возвращает правильный набор результатов с использованием SQL 2005. Он выглядит следующим образом:

select 
    case
    when convert(varchar(4),datepart(yyyy,bug.datecreated),101)+ ' Q' +convert(varchar(2),datepart(qq,bug.datecreated),101) = '1969 Q4' then '2009 Q2'
    else convert(varchar(4),datepart(yyyy,bug.datecreated),101)+ ' Q' +convert(varchar(2),datepart(qq,bug.datecreated),101)
    end as [Quarter],
    bugtypes.bugtypename,
    count(bug.bugid) as [Total]
from bug left outer join bugtypes on bug.crntbugtypeid = bugtypes.bugtypeid and bug.projectid = bugtypes.projectid
where 
    (bug.projectid = 44 
    and bug.currentowner in (-1000000031,-1000000045) 
    and bug.crntplatformid in (42,37,25,14))
or
    (bug.projectid = 44 
    and bug.currentowner in (select memberid from groupmembers where projectid = 44 and groupid in (87,88))
    and bug.crntplatformid in (42,37,25,14))

group by
    case
    when convert(varchar(4),datepart(yyyy,bug.datecreated),101)+ ' Q' +convert(varchar(2),datepart(qq,bug.datecreated),101) = '1969 Q4' then '2009 Q2' else convert(varchar(4),datepart(yyyy,bug.datecreated),101)+ ' Q' +convert(varchar(2),datepart(qq,bug.datecreated),101)
    end,
    bugtypes.bugtypename
order by 1,3 desc

Он создает хорошо сгруппированный список лет и кварталов, связанный дескриптор и количество инцидентов в убывающем порядке. Я бы хотел дополнительно отфильтровать это, чтобы отображались только 10 наиболее отправленных инцидентов за квартал.

Я борюсь с тем, как взять этот набор результатов и добиться этого.


person Eric Alexander    schedule 16.04.2010    source источник
comment
Возможно, упорядочить по столбцу 3 (Total) desc и добавить класс WHERE ROWNUM ‹= 10 (если Oracle) или LIMIT 10, если MySQL?   -  person Brenda Holloway    schedule 16.04.2010
comment
Но где и как, мне не нужно всего десяти записей. Я хочу 10 записей за квартал.   -  person Eric Alexander    schedule 16.04.2010


Ответы (3)


Вы уже заказываете по кварталу и по итогу. Вы пробовали использовать:

SELECT TOP 10

..... остальная часть запроса

РЕДАКТИРОВАТЬ: Прочитав ваш комментарий, я понял, что вам нужно использовать RANK и Partition, чтобы эта работа заработала. Вы можете обернуть CTE, как показано ниже:

;WITH IncidentsTable AS
(
   ... Insert Your Query here ...
)
SELECT * FROM
(
    SELECT [Quarter],
       BugTypeName,
       Total,
       Rank() OVER (Partition BY [Quarter] order by Total DESC) AS Ranking
     FROM
    IncidentsTable
)
WHERE
    Ranking <= 10
ORDER BY
      Quarter, Total;
person Jose Basilio    schedule 16.04.2010
comment
Это вернет только 10 записей, я хочу 10 лучших записей за каждый квартал. Итак, если есть 15 кварталов, я хочу, чтобы было возвращено 150 записей, по 10 лучших для каждого. - person Eric Alexander; 16.04.2010
comment
Мне нравится эта структура, она немного чище, чем пытаться вставить мой запрос в Alex K. - person Eric Alexander; 16.04.2010

Такой шаблон сделает это (разбивать и нумеровать каждую четверть, игнорируя числа ‹= 10):

SELECT * FROM (
    SELECT Qtr, fld,
    ROW_NUMBER() OVER(PARTITION BY Qtr ORDER BY fld) as RN 
    FROM tbl 
) AS T
WHERE RN <= 10
ORDER BY Qtr

NTILE(10), вероятно, тоже так поступит.

person Alex K.    schedule 16.04.2010
comment
Это было близко, я заменил Row_Number () на Rank (), и это сработало. - person Eric Alexander; 16.04.2010

вы можете использовать ранг и раздел

Select * From 
(
    Select *,   Rank() over (Partition BY qtr order by qtr, id ) as Rank
    From
    (
              Select 1 as id, 1 as qtr,'hello' as msg
    union all select 2, 1,'hello'
    union all select 3,1,'hello'
    union all select 4,1,'hello'
    union all select 5,1,'hello'
    union all select 6,2,'hello'
    union all select 7,2,'hello'
    union all select 8,2,'hello'
    union all select 9,2,'hello'
    union all select 10,2,'hello'
    ) BaseQuery 
)QryWithRank
where rank <= 2
person Jeremy    schedule 16.04.2010