none
Mudar agrupamento de valores. RRS feed

  • Pergunta

  • Olá estou com um script aqui que faz um cálculo matemático pegando valores de cada hora, pegando o minimo valor dentro da hora atual, menos o menor valor da hora anterior. Agrupado em 24 horas.

    SELECT
    	E3TimeStamp Horario,
    	MIN(MGE01_4_KWh) - (SELECT TOP 1 MIN(MGE01_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26 23:00:00'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE01,
    	MIN(MGE02_4_KWh) - (SELECT TOP 1 MIN(MGE02_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26 23:00:00'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE02,
    	MIN(MGE03_4_KWh) - (SELECT TOP 1 MIN(MGE03_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26 23:00:00'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE03
    FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] a
    WHERE E3TimeStamp >= '2020-05-27 00:00:00' AND E3TimeStamp <= '2020-05-27 23:59:59'
    GROUP BY E3TimeStamp
    ORDER BY E3TimeStamp

    O script que eu desejo é um que basicamente, pegue o menor valor do dia, menos o menor valor do dia anterior. Agrupado por dias. Vou deixar uma imagem aqui que explica exatamente o que eu quero.


    Yohrannes


    quinta-feira, 4 de junho de 2020 20:50

Respostas

  • Yohrannes,

    Ok, eu apresentei no meu post anterior uma forma de você usar a CTE, que por padrão se iniciar através do comando ;With e se encerra em conjunto com o Select logo após o bloco de código delimitado pelos parênteses.

    No seu caso, o que você pode fazer, se o código compartilhado por você já esta te atendendo é trocar a coluna que esta sendo usada para o agrupamento.

    Acredito que se mudar as condições aplicadas na cláusula Where para os dias desejados você consiga obter o resultado:

    SELECT
    	E3TimeStamp Horario,
    	MIN(MGE01_4_KWh) - (SELECT TOP 1 MIN(MGE01_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp = '2020-05-26'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE01,
    	MIN(MGE02_4_KWh) - (SELECT TOP 1 MIN(MGE02_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp = '2020-05-26'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE02,
    	MIN(MGE03_4_KWh) - (SELECT TOP 1 MIN(MGE03_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp = '2020-05-26'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE03
    FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] a
    WHERE E3TimeStamp = '2020-05-27' 
    GROUP BY E3TimeStamp
    ORDER BY E3TimeStamp

    Não sei se estas alterações te atendem, mas vejo que é a questão da forma que esta passando os valores....


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 5 de junho de 2020 19:32

Todas as Respostas

  • Yohrannes,

    Tendo como base esta sua frase: "O script que eu desejo é um que basicamente, pegue o menor valor do dia, menos o menor valor do dia anterior. Agrupado por dias. Vou deixar uma imagem aqui que explica exatamente o que eu quero."

    Não seria o caso de fazer uso da função Min() ou até mesmo Min() combinada com a cláusula Over().

    Mas para isso funcionar você transformar o código atual em uma CTE?

    Algo similar a isso:

    ;With CTEResultado
    As
    (
    SELECT
    	E3TimeStamp Horario,
    	MIN(MGE01_4_KWh) - (SELECT TOP 1 MIN(MGE01_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26 23:00:00'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE01,
    	MIN(MGE02_4_KWh) - (SELECT TOP 1 MIN(MGE02_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26 23:00:00'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE02,
    	MIN(MGE03_4_KWh) - (SELECT TOP 1 MIN(MGE03_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26 23:00:00'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE03
    FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] a
    WHERE E3TimeStamp >= '2020-05-27 00:00:00' AND E3TimeStamp <= '2020-05-27 23:59:59'
    GROUP BY E3TimeStamp
    )
    Select "Aqui você vai aplicar as regras --- 
    From CTEResultado
    ORDER BY E3TimeStamp

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 4 de junho de 2020 21:58
  • Olá, com base no que voce tinha falado "Mas para isso funcionar você transformar o código atual em uma CTE?"

    Então, eu não faço uso de nenhuma CTE, porém terei agrupar em dias, ao invés de horas como neste script.


    Yohrannes

    sexta-feira, 5 de junho de 2020 16:56
  • Yohrannes,

    Ok, eu apresentei no meu post anterior uma forma de você usar a CTE, que por padrão se iniciar através do comando ;With e se encerra em conjunto com o Select logo após o bloco de código delimitado pelos parênteses.

    No seu caso, o que você pode fazer, se o código compartilhado por você já esta te atendendo é trocar a coluna que esta sendo usada para o agrupamento.

    Acredito que se mudar as condições aplicadas na cláusula Where para os dias desejados você consiga obter o resultado:

    SELECT
    	E3TimeStamp Horario,
    	MIN(MGE01_4_KWh) - (SELECT TOP 1 MIN(MGE01_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp = '2020-05-26'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE01,
    	MIN(MGE02_4_KWh) - (SELECT TOP 1 MIN(MGE02_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp = '2020-05-26'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE02,
    	MIN(MGE03_4_KWh) - (SELECT TOP 1 MIN(MGE03_4_KWh)
    		FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] b
    		WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp = '2020-05-26'
    		GROUP BY E3TimeStamp
    		ORDER BY b.E3TimeStamp DESC) AS MGE03
    FROM [BDMI_EIXOLESTE].[dbo].[Tab_TotEn_UTR_04] a
    WHERE E3TimeStamp = '2020-05-27' 
    GROUP BY E3TimeStamp
    ORDER BY E3TimeStamp

    Não sei se estas alterações te atendem, mas vejo que é a questão da forma que esta passando os valores....


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 5 de junho de 2020 19:32
  • Consegui aqui, obrigado no caso eu alterei para...

    WHERE a.E3TimeStamp > b.E3TimeStamp AND E3TimeStamp >= '2020-05-26'


    Yohrannes

    quarta-feira, 17 de junho de 2020 18:21