首页 > 解决方案 > 从 SQL Server 中的 MAX() GROUP BY 中选择行

问题描述

我有一张我打电话的桌子EventosoutTime我必须从警报中选择相应的较大的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并仍然获得它的价值。

标签: sqlsql-serveroptimization

解决方案


这只是根据您的描述进行的有根据的猜测。请注意,我使用了更加明确的 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

推荐阅读