【问题标题】:MSSQL: How to display TOP 10 items from GROUP BY query?MSSQL:如何显示 GROUP BY 查询中的 TOP 10 项?
【发布时间】:2016-12-16 13:00:37
【问题描述】:

我有一个查询,结果显示为:

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

我需要从上个月的 Raised_Incident 计数中选择 TOP 10 SN_NAME,然后显示他们过去 12 个月的 COUNTS。

我用来显示上述结果的查询是这个:

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 行。

请指教。

【问题讨论】:

  • 把期望的输出以表格的形式。比文字更有效
  • 标记您正在使用的 dbms。 (那里有很多非 ANSI SQL...)

标签: sql count group-by subquery


【解决方案1】:

如果我理解正确,您想要最近一个月的前 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 起事件。

【讨论】:

  • 对列名和“;”进行小幅调整设置我的变量后,它就像一个魅力!谢谢戈登。
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多