Extrair apenas o registro mais recente numa consulta SQL

SQL

14/06/2020

Gostaria de acertar a minha consulta SQL (abaixo) para extrair, somente, o último (maior, mais recente) registro do DateTime (data e hora) de cada TagName.

SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = DateAdd(dd,-60,GetDate())
SET @EndDate = GetDate()
SET NOCOUNT OFF
SELECT temp.TagName ,Description ,DateTime ,Value ,StartDateTime From (
SELECT *
FROM History
WHERE History.TagName LIKE ('%NIVEL_ALTO')
AND Value = 1
AND wwRetrievalMode = 'Delta'
AND wwVersion = 'Latest'
AND DateTime >= @StartDate
AND DateTime <= @EndDate) temp
LEFT JOIN Tag ON Tag.TagName =temp.TagName
WHERE temp.StartDateTime >= @StartDate
Kelyson Resende

Kelyson Resende

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

14/06/2020

tente algo assim:
SELECT
   *
FROM
   History H
INNER JOIN
   (SELECT
      TagName, max(DateTime) MaxData
   FROM
      History
   WHERE
      TagName LIKE ('%NIVEL_ALTO')
      AND Value = 1
      AND wwRetrievalMode = 'Delta'
      AND wwVersion = 'Latest'
      AND DateTime >= @StartDate
      AND DateTime <= @EndDate
   GROUP BY
      TagName) M ON M.TagName = H.TagName and M.MaxData = H.DateTime

GOSTEI 1

Mais Respostas

Kelyson Resende

Kelyson Resende

14/06/2020

Perfeito, meu amigo!
Muito obrigado!!!

Desejo acertar mais uns detalhe na consulta:
1. Inserir mais dois termos no LIKE, ou seja, seriam NIVEL_ALTO, NIVEL_MUITO_ALTO e NIVEL_MUITO_MUITO_ALTO.
2. Apresentar o resultado com apenas duas colunas. Sendo elas: TagName e DateTime (nessa sequência).
3. Fazer esta consulta a partir de uma planilha do Excel com macro habilitada (através de um botão mesmo).

Mais uma vez, agradeço!
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/06/2020

se você precisa somente dos campos TagName e DateTime, não é necessário relacionamento algum.
Basta fazer:
SELECT
      TagName, max(DateTime) MaxData
   FROM
      History
   WHERE
      TagName (LIKE '%NIVEL_ALTO%' OR LIKE '%NIVEL_MUITO_ALTO%' OR LIKE '%NIVEL_MUITO_MUITO_ALTO%')
      AND Value = 1
      AND wwRetrievalMode = 'Delta'
      AND wwVersion = 'Latest'
      AND DateTime >= @StartDate
      AND DateTime <= @EndDate
   GROUP BY
      TagName

a cláusula like serve para buscar parte de um conteúdo. se o conteúdo do campo for exatamente um dos valores que você postou, pode trocar o like por in:
SELECT
      TagName, max(DateTime) MaxData
   FROM
      History
   WHERE
      TagName IN ('NIVEL_ALTO', 'NIVEL_MUITO_ALTO', 'NIVEL_MUITO_MUITO_ALTO')
      AND Value = 1
      AND wwRetrievalMode = 'Delta'
      AND wwVersion = 'Latest'
      AND DateTime >= @StartDate
      AND DateTime <= @EndDate
   GROUP BY
      TagName
GOSTEI 1
Kelyson Resende

Kelyson Resende

14/06/2020

Perfeito!
Muito obrigado!!!
GOSTEI 0
POSTAR