Cláusula HAVING
A cláusula HAVING é usada para filtrar os eventos recebidos durante o intervalo de agrupamento especificado na cláusula WITHIN. Por exemplo, uma instrução SELECT poderia ser construída de forma que não retorne nada a menos que tenham ocorrido pelo menos 5 eventos nos últimos 30 segundos (INTERVAL).
A cláusula WITHIN segue imediatamente na instrução SELECT após a cláusula GROUP. A cláusula HAVING opera na propriedade NumberOfEvents da classe de sistema __AggregateEvent, da qual o grupo criado pela cláusula GROUP é um membro. A cláusula HAVING pode usar todos os operadores relacionais padrão.
A sintaxe é mostrada a seguir:
SELECT * FROM EventClass [WHERE property = value]
GROUP WITHIN interval [BY property_list]
HAVING NumberOfEvents operator constant
O valor EventClass é a classe de evento da qual o evento é um membro e value é o valor da propriedade na qual a notificação é necessária. O intervalo é um inteiro sem sinal que representa o intervalo de agrupamento (em segundos) após receber o primeiro evento. A lista de propriedades é uma lista delimitada por vírgulas de uma ou mais propriedades incluídas na classe de evento. O operador é qualquer operador relacional. O valor constante é qualquer inteiro de 32 bits sem sinal que indica o número de eventos usados para filtragem.
Ao usar a cláusula HAVING, as cláusulas WHERE e BY são opcionais.
A consulta de evento a seguir solicita que as notificações da classe EmailEvent sejam agrupadas em um evento 300 segundos após o primeiro evento que o WMI receber. Além disso, a consulta solicita que a instância __AggregateEvent seja entregue somente se o WMI receber mais de cinco eventos de email nesses 300 segundos.
SELECT * FROM EmailEvent GROUP WITHIN 300 HAVING NumberOfEvents > 5
O exemplo a seguir agrupa todos os eventos recebidos em 600 segundos (ou seja, 10 minutos) pela propriedade TargetInstance.SourceName. Neste exemplo, os eventos de agregação serão entregues somente se o número de eventos de Win32_NTLogEvent recebidos da mesma fonte exceder 25. Tenha em mente que o operador ISA faz com que a propriedade TargetInstance da classe de sistema __InstanceCreationEvent represente uma instância da classe Win32_NTLogEvent.
SELECT * FROM __InstanceCreationEvent
WHERE TargetInstance ISA "Win32_NTLogEvent"
GROUP WITHIN 600 BY TargetInstance.SourceName
HAVING NumberOfEvents > 25