获取n个最频繁的值

时间:2018-07-16 12:15:28

标签: sql sql-server

我正在使用MS SQL,我想获取给定字段的n个最频繁的值。 当前查询是:

SELECT DISTINCT e.message
FROM monitor_main m inner join monitor_event e on (e.mainId = m.id)
WHERE 
e.statement = @statement
and m.dateStart >= @dateStart
and m.dateEnd <= @dateEnd

执行该查询时,我收到一组消息,其日期在@dateStart和@dateEnd之间。从这个集合中,我想获得n个最频繁的e.message,因为我认为效率不高,所以我不想使用PHP。请注意,这些表中有很多行(数百万行)。我尝试了(n = 10):

SELECT DISTINCT e.message, COUNT(e.message)
FROM monitor_main m inner join monitor_event e on (e.mainId = m.id)
WHERE 
e.statement = @statement
and m.dateStart >= @dateStart
and m.dateEnd <= @dateEnd
GROUP BY e.message ORDER BY COUNT(e.message)
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY

但是我不确定它是否可以解决我的问题,如果可以,是否有效? 有人可以帮助我或建议我其他查询吗?

我无法测试它,因为我有很多行,而且我现在无权创建TEST表。

谢谢

1 个答案:

答案 0 :(得分:2)

您不需要SELECT DISTINCTDESC则需要ORDER BY

SELECT e.message, COUNT(e.message)
FROM monitor_main m INNER JOIN
     monitor_event e 
     ON e.mainId = m.id
WHERE e.statement = @statement AND
      m.dateStart >= @dateStart AND
      m.dateEnd <= @dateEnd
GROUP BY e.message
ORDER BY COUNT(e.message) DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

为了提高性能,您可能希望在monitor_event(statement, mainId, message)monitor_main(id, dateStart, dateEnd)上建立索引。