2013-10-01 2 views
1

도움을 받으시기 바랍니다. 나는이 초보자가 나를 괴롭히기 시작할 정도로 초보자이다.여러 태그에서 마지막 값을 반환하는 SQL 쿼리

현재 매일 Meter Name에 대한 데이터를 수집 중입니다. 이 데이터는 현재 TimeStamp, Name, Value 열이있는 테이블에 기록됩니다. 그러나 테이블의 각 Name에 대해 기록 된 가장 최근 (마지막) 값만 반환하는 쿼리를 만들고 싶습니다.

지금까지이 쿼리를 작성했지만 Top 1 구문이 필요하지 않은 것 같습니다.

SELECT Top 1 (DataLog.Timestamp), MeterTags.Name, DataLog.Value 
FROM Meters 
INNER JOIN MeterTags 
ON Meters.MeterId = MeterTags.MeterId 
INNER JOIN DataLog 
ON MeterTags.MeterTagId = DataLog.MeterTagId 
WHERE Meters.MeterTypeId = 8 
GROUP By MeterTags.Name, DataLog.Timestamp 

당신이 줄 수있는 조언을 주시면 감사하겠습니다.

미리 감사드립니다.

+0

어떤 DBMS를 사용하고 있습니까? – GarethD

+0

SQL Server입니까? – SriniV

+0

죄송합니다, 예 SQL Server 2008 R2 – user2547340

답변

1

당신은 각 레코드를 다음 단지 각각의 이름에 대한 첫 번째 선택 (각 MeterTags.Name 0으로 재설정)를 ROWNUMBER주고 ROW_NUMBER를 사용할 수 있습니다

:

WITH CTE AS 
( SELECT DataLog.Timestamp, 
      MeterTags.Name, 
      DataLog.Value, 
      RowNumber = ROW_NUMBER() OVER(PARTITION BY MeterTags.Name 
             ORDER BY DataLog.TimeStamp DESC) 
    FROM Meters 
      INNER JOIN MeterTags 
       ON Meters.MeterId = MeterTags.MeterId 
      INNER JOIN DataLog 
       ON MeterTags.MeterTagId = DataLog.MeterTagId 
    WHERE Meters.MeterTypeId = 8 
) 
SELECT CTE.Timestamp, 
     CTE.Name, 
     CTE.Value 
FROM CTE 
WHERE CTE.RowNumber = 1; 

또 다른 해결책은 TOP 1APPLY 내부를 사용하는 것입니다 쿼리 아래 는

SELECT DataLog.Timestamp, 
     MeterTags.Name, 
     DataLog.Value 
FROM Meters 
     INNER JOIN MeterTags 
      ON Meters.MeterId = MeterTags.MeterId 
     CROSS APPLY 
     ( SELECT TOP 1 TimeStamp, Value 
      FROM DataLog 
      WHERE MeterTags.MeterTagId = DataLog.MeterTagId 
      ORDER BY TimeStamp DESC 
     ) DataLog 
WHERE Meters.MeterTypeId = 8; 
+0

모두 감사합니다. – user2547340

+0

타임 스탬프가 yyyy-MM-dd hh : mm : ss 형식으로 반환되지 않고 SQL Server Management Studio에서이 형식의 타임 스탬프를 표시하고 있습니다. 중요한 차이점이 있습니다. 날짜는 날짜이며 서식이 없으며 서식이 필요한 텍스트로 표시 될 때만입니다. 저는 ** 모든 ** 형식화가 프레젠테이션 계층에서 SQL 외부에서 수행되어야한다는 큰 지지자입니다. 데이터베이스는 프리젠 테이션 레이어를 표현하기 위해 데이터를 저장하기위한 것입니다. 입니다. – GarethD

+0

당신은'CONVERT (VARCHAR, timestamp, 112)'를 사용하여 SQL에서 그것을 할 수 있습니다. 그러나 응용 프로그램 계층으로 보내질 때 이것은 문자열이 아닌 날짜입니다. 그래서 이것을 날짜로 조작 할 수 없습니다 . – GarethD

0

시도

select Timestamp,Name,Value 
from 
(

SELECT (DataLog.Timestamp), MeterTags.Name, DataLog.Value,rownum,ROW_NUMBER() OVER 
(PARTITION BY MeterTags.Name ORDER BY DataLog.Timestamp desc) AS rownum FROM Meters 
INNER JOIN MeterTags 
ON Meters.MeterId = MeterTags.MeterId 
INNER JOIN DataLog 
ON MeterTags.MeterTagId = DataLog.MeterTagId 
)data 
    where rownum=1 
관련 문제