Дальнейший фильтр результатов SQL - PullRequest
1 голос
/ 16 апреля 2010

У меня есть запрос, который возвращает правильный набор результатов, используя 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 наиболее представленных инцидентов в квартал.

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

Ответы [ 3 ]

5 голосов
/ 16 апреля 2010

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

SELECT TOP 10

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

РЕДАКТИРОВАТЬ: После прочтения вашего комментария я понимаю, что вам нужно использовать RANK и раздел , чтобы сделать эту работу. Вы можете завернуть в 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;
1 голос
/ 16 апреля 2010

Шаблон, подобный этому, сделает это (разделение и номер в каждом квартале игнорируют числа <= 10): </p>

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), вероятно, сделал бы это также.

0 голосов
/ 16 апреля 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...