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

アドバイスをいただければ幸いです。

前もって感謝します。

4

2 に答える 2

1

ROW_NUMBERを使用して各レコードに行番号を指定し (それぞれの行番号を 0 にリセットMeterTags.Name)、各名前の最初の番号を選択するだけです。

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;

別の解決策は、 APPLYTOP 1内で を使用することです。

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;
于 2013-10-01T09:12:49.760 に答える