从SQL Server中的MAX()GROUP BY中选择行

时间:2018-07-18 17:51:56

标签: sql sql-server optimization

我有一个名为Eventos的表。我必须从具有更大outTime的警报中选择相应的inTime

而且我必须快速/优化。我表中大约有100万个条目。

这是我的代码:

SELECT 
    CadGrupoEventos.Severidade AS Nível, 
    CadGrupoEquipamentos.Nome AS Grupo, 
    CadEquipamentos.TAG AS Equipamento, 
    CadEventos.MensagemPT AS 'Mensagem de alarme', 
    MAX(Eventos.InTime) AS 'Hora do evento', 
    Eventos.OutTime AS 'Hora de saída'
FROM 
    CadGrupoEventos, 
    CadEquipamentos, 
    CadEventos, 
    Eventos, 
    CadUsuarios, 
    CadGrupoEquipamentos
WHERE 
    Eventos.Acked = 0 
    AND CadGrupoEventos.Codigo = CadEventos.Grupo 
    AND CadEquipamentos.Codigo = Eventos.TAG 
    AND CadEventos.Codigo = Eventos.CodMensagem 
    AND CadGrupoEquipamentos.Codigo = CadEquipamentos.Grupo
GROUP BY 
    CadGrupoEventos.Severidade, 
    CadEquipamentos.TAG, 
    CadEventos.MensagemPT, 
    CadGrupoEquipamentos.Nome, 
    Eventos.OutTime

此代码按原样返回表中的每个条目。

我必须从Eventos.OutTime中取出GROUP BY并仍然获得其价值。

1 个答案:

答案 0 :(得分:1)

这只是根据您的描述进行的有根据的猜测。注意,我使用了更明确的ANSI-92样式连接。我还使用别名使它更易读。您的查询可能看起来像这样。

select x.Severidade AS Nível, 
       x.Nome AS Grupo, 
       x.TAG AS Equipamento, 
       x.MensagemPT AS [Mensagem de alarme], 
       x.[Hora do evento], 
       x.OutTime AS [Hora de saída]
from
(
    SELECT cge.Severidade, 
           cgequip.Nome, 
           ce.TAG, 
           cevt.MensagemPT, 
           MAX(e.InTime) AS [Hora do evento], 
           e.OutTime
           , RowNum = ROW_NUMBER() over(partition by cge.Severidade, ce.TAG, cevt.MensagemPT, cgequip.Nome order by e.OutTime /*maybe desc???*/)
    FROM CadGrupoEventos cge 
    join CadEventos cevt on cge.Codigo = cevt.Grupo     
    join Eventos e on AND cevt.Codigo = e.CodMensagem 
    join CadEquipamentos ce on ce.Codigo = e.TAG 
    join CadGrupoEquipamentos cgequip on cgequip.Codigo = ce.Grupo
    cross join CadUsuarios cu --not sure if this is really what you want but your original code did not have any logic for this table
    WHERE e.Acked = 0 
    GROUP BY cge.Severidade, 
             ce.TAG, 
             cevt.MensagemPT, 
             cgequip.Nome, 
             e.OutTime
) x
where x.RowNum = 1