Duvidas select no SQL

13/07/2010

0

Boa Tarde Pessoal,   Estou com uma duvida em um select no sqlserver 2005, so para explicar o que necessito, tenho uma tabela com varios registros ja existentes nelas, e a consulta se executa por um intervalo de datas, tipo assim dta_hora_inicial, data_hora_Final, so que o que necessito, é visualizar so o ultimo registro valido neste periodo, se alguem conseguir me da uma luz, ficaria grato, abaixo bem o que necessito fazer:   select TAG, MAX(CAST(VALOR AS FLOAT)) AS ULTIMO_VALOR_VALIDO, MAX(VALOR) AS MAXIMO, MIN(VALOR) AS MINIMO, CASE WHEN TAG = '410_AU_TOTAL_SQT' THEN MAX(CAST(VALOR AS NUMERIC(15,2))) - MIN(CAST(VALOR AS NUMERIC(15,2))) ELSE '0.00' end as CALCULO_TAG_TOTAL from RELATORIO WHERE DATA_HORA BETWEEN CONVERT(DATETIME, '09/07/2010 18:05:00',103) AND CONVERT(DATETIME, '09/07/2010 18:05:59',103) GROUP BY TAG ORDER BY TAG    
Is Informação

Is Informação

Responder

Posts

13/07/2010

Emerson Nascimento

como você não especificou como definir o último registro válido, tente:

select top 1
  TAG,
  MAX(CAST(VALOR AS FLOAT)) AS ULTIMO_VALOR_VALIDO,
  MAX(VALOR) AS MAXIMO,
  MIN(VALOR) AS MINIMO,
  CASE WHEN TAG = '410_AU_TOTAL_SQT'
       THEN CAST(MAX(VALOR) - MIN(VALOR) AS NUMERIC(15,2))
       ELSE 0.00
  END as CALCULO_TAG_TOTAL
from
  RELATORIO
where
  DATA_HORA BETWEEN CONVERT(DATETIME, '09/07/2010 18:05:00',103)
  AND CONVERT(DATETIME, '09/07/2010 18:05:59',103)
group by
  TAG
order by
  TAG desc



ou, se o último registro puder ser definido pela maior data/hora:

select
  TAG,
  MAX(CAST(VALOR AS FLOAT)) AS ULTIMO_VALOR_VALIDO,
  MAX(VALOR) AS MAXIMO,
  MIN(VALOR) AS MINIMO,
  CASE WHEN TAG = '410_AU_TOTAL_SQT'
       THEN CAST(MAX(VALOR) - MIN(VALOR) AS NUMERIC(15,2))
       ELSE 0.00
  END as CALCULO_TAG_TOTAL
from
  RELATORIO
where
  DATA_HORA = (select max(DATA_HORA)
               from RELATORIO
               where DATA_HORA BETWEEN CONVERT(DATETIME, '09/07/2010 18:05:00',103)
                 AND CONVERT(DATETIME, '09/07/2010 18:05:59',103))
group by
  TAG
order by
  TAG desc



você pode querer também o último registro de cada TAG:

select
  rel.TAG,
  MAX(CAST(rel.VALOR AS FLOAT)) AS ULTIMO_VALOR_VALIDO,
  MAX(rel.VALOR) AS MAXIMO,
  MIN(rel.VALOR) AS MINIMO,
  CASE WHEN rel.TAG = '410_AU_TOTAL_SQT'
       THEN CAST(MAX(rel.VALOR) - MIN(rel.VALOR) AS NUMERIC(15,2))
       ELSE 0.00
  END as CALCULO_TAG_TOTAL
from
  RELATORIO rel
where
  rel.DATA_HORA = (select max(rel2.DATA_HORA)
                   from RELATORIO rel2
                   where rel2.DATA_HORA BETWEEN CONVERT(DATETIME, '09/07/2010 18:05:00',103)
                     AND CONVERT(DATETIME, '09/07/2010 18:05:59',103)
                     AND rel2.TAG = rel.TAG)
group by
  rel.TAG
order by
  rel.TAG desc



talvez dê algum erro de sintaxe, pois não tenho seu banco de dados pra testar (nem SQL disponível no momento)

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar