2016-12-16 50 views
0

我有這顯示作爲結果的查詢:MSSQL:如何顯示來自GROUP BY查詢的TOP 10項目?

Year-Month SN_NAME Raised Incidents 
2015-11 A 14494 
2015-11 B 8432 
2015-11 D 5496 
2015-11 G 4778 
2015-11 H 4554 
2015-11 C 4203 
2015-11 X 3477 
.......+ thousands more rows for 2015-11 
2015-12 A 3373 
2015-12 B 3322 
2015-12 H 2814 
2015-12 D 2745 
......+ thousands more rows for 2015-12 
......+ thousands more rows for 2016-01 - 2016-10 
2016-11 B 2645 
2016-11 C 2571 
2016-11 E 2475 
2016-11 D 2466 
....+ thousands more rows for 2016-11 

,我需要選擇TOP 10 SN_NAME通過Raised_Incident從上個月計數和再展示自己的計數之前的12個月。

我用它來顯示上述結果的查詢是這樣的一個:

DECLARE @startOfCurrentMonth DATETIME 
SET @startOfCurrentMonth = DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0) 

SELECT 
    CONVERT(char(7),IM.SN_SYS_CREATED_ON,121) as "Year-Month" 
    ,CI.SN_NAME 
    ,COUNT(IM.SN_NUMBER) as "Raised Incidents" 
FROM [dbo].[tab_IM_Incident] IM 
    LEFT JOIN [dbo].[tab_SNOW_CMDB_CI] CI on IM.SN_CMDB_CI = CI.SN_SYS_ID 
WHERE 
    IM.SN_SYS_CREATED_ON >= DATEADD(month, -13, @startOfCurrentMonth) AND IM.SN_SYS_CREATED_ON < @startOfCurrentMonth 
    AND (IM.SN_U_SUB_STATE <> 'Cancelled' OR IM.SN_U_SUB_STATE IS NULL) 
GROUP BY 
    CONVERT(char(7),IM.SN_SYS_CREATED_ON,121) 
    , CI.SN_NAME 
ORDER BY 
    CONVERT(char(7),IM.SN_SYS_CREATED_ON,121) 
    , COUNT(IM.SN_NUMBER) DESC 

的問題是我不知道如何限制每個月值只有TOP10,因爲查詢返回我約200 000行總共應該返回13x10 = 130行。

預期的產出與問題一致,但在過去13個月中僅限於每月最多10行。

請指教。

+0

將預期的輸出放在表格的表格中。比單詞更有效 – GurV

+0

標記您正在使用的dbms。 (很多非ANSI SQL ......) – jarlh

回答

0

如果我理解正確,您希望10個事件在最近的月份中排名靠前,然後在數據中查看所有月份的事件。

這裏有一個方法:

with t as (
     your query here 
    ) 
select t.* 
from (select top 10 t.* 
     from t 
     order by YearMonth desc, RaisedIncidents desc 
    ) top10 left join 
    t 
    on t.sn_name = top10.sn_name 
order by YearMonth desc, RaisedIncidents desc; 

注意,top 10沒有在最近一個月的篩選。取而代之的是,最近一個月的訂單,然後RaisedIncidents。這假設最近一個月至少有10起事件。

+0

通過對colum名稱和「;」的小調整設置我的變量後,它就像一個魅力!謝謝Gordon。 –