Array
(
)

Duvidas select no SQL

Is Informação
   - 13 jul 2010

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

Emerson
   - 13 jul 2010

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)