我正在使用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表。
谢谢
答案 0 :(得分:2)
您不需要SELECT DISTINCT
,DESC
则需要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)
上建立索引。