none
Fazer cálculo sem usar uma tabela temporária RRS feed

  • Pergunta

  • Olá a todos, no meu banco de dados, eu tenho uma tabela que tem uma variável datetime, e outra variável com o valor em float.

    A variável datetime ela vai marcando o dia a hora e minuto.

    E a variável do valor, conforme vai passando o tempo o valor vai crescendo, sempre crescendo.

    Eu fiz uma script aonde eu agrupo esses dados da tabela em Hora, então ele vai me mostrando um valor a cada hora, 

    pegando o valor mínimo dentro de cada hora.

    Então fiz uma tabela temporária com quatro variáveis, uma datetime e as outras três float.

    Uma variável float ela pega os valores normais da tabela, a outra pega os valores só que da linha anterior, utilizando o comando lag.

    E a outra pega o valor da primeira, menos o valor da segunda (a que utiliza o comando lag)

    Só que eu preciso fazer a mesma coisa que eu fiz, sem ter que criar uma tabela temporária, existe alguma forma?

    Esta é a script.

    USE BDMI_EIXOLESTE IF OBJECT_ID('tempdb..#Tab_TotHora') IS NOT NULL BEGIN DROP TABLE #Tab_TotHora END CREATE TABLE #Tab_TotHora ( -- Criando tabela temporaria Hora int, Minimo float, Minimoant float, FI01_1_TOT as (Minimo - Minimoant) -- O mínimo da hora, menos o máximo da hora anterior ) INSERT INTO #Tab_TotHora (Hora,Minimo,Minimoant) SELECT DATEPART(HOUR, E3TimeStamp),-----Hora MIN(FI01_1_TOT),-------Minimo LAG (MIN(FI01_1_TOT)) OVER (ORDER BY DATEPART(HOUR, E3TimeStamp)) -- Valor Minimo da hora anterior, na mesma linha da hora atual. FROM Tab_TotHora_UTR_01 WHERE CAST(E3TimeStamp as date) = '2020-04-23' GROUP BY DATEPART(HOUR, E3TimeStamp) SELECT * FROM #Tab_TotHora

    Yohrannes


    terça-feira, 28 de abril de 2020 19:01

Respostas

Todas as Respostas

  • Boa tarde,

    Segue uma sugestão para testes:

    with
        CTE_Min as
        (
            SELECT
                DATEPART(HOUR, E3TimeStamp) as Hora,
                MIN(FI01_1_TOT) as Minimo
            FROM Tab_TotHora_UTR_01
            WHERE
                CAST(E3TimeStamp as date) = '2020-04-23'
            GROUP BY
                DATEPART(HOUR, E3TimeStamp)
        ),
    
        CTE_Lag as
        (
            SELECT
                Hora,
                Minimo,
                LAG (Minimo) OVER (ORDER BY Hora) as MinimoAnt
            FROM CTE_Min
        )
    
    SELECT
        Hora,
        Minimo,
        MinimoAnt,
        Minimo - MinimoAnt as FI01_1_TOT
    FROM CTE_Lag

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 28 de abril de 2020 20:55
  • Olá eu testei este script parece que ocorreu um erro nesse with.

    Mensagem 319, Nível 15, Estado 1, Linha 3
    Sintaxe incorreta próxima à palavra-chave 'with'. Se esta instrução for uma expressão de tabela comum, uma cláusula xmlnamespaces ou uma cláusula de contexto de controle de alterações, a instrução anterior deverá terminar com ponto-e-vírgula.
    Mensagem 102, Nível 15, Estado 1, Linha 14
    Sintaxe incorreta próxima a ','.

    Ainda não conheço este comando with.....


    Yohrannes

    terça-feira, 28 de abril de 2020 21:10
  • Nessa sugestão que postei foram utilizadas CTEs para executar as etapas e utilizar o resultado de cada uma na etapa seguinte.

    Confira abaixo a página sobre CTEs:

    https://docs.microsoft.com/pt-br/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15

    Sobre o erro, se existem outros comandos antes do With, acrescente um ponto e vírgula após o último comando que antecede o With.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 28 de abril de 2020 21:21