0

私はこのフォーラムの長年の読者であり、非常に役に立ちましたが、自分の要件に固有の解決策が見つからないという質問があるため、何かを尋ねなければならないのはこれが初めてです。日付でソートされた検針値を返す select ステートメントがあります (最新の検針値が一番上に表示されます)。99.9% のケースで、日付が進むにつれて検針値は常に上昇しますが、システム エラーのために時々低下するものもあります。必要です。下の行の読み取り値 (前の読み取り値) が最新の読み取り値 (現在のセル) よりも大きいインスタンスを特定するには、LEAD 関数に遭遇しましたが、Oracle または SS-MS-2012 でのみ、SS- を使用していますMS-2008。これは、私の選択ステートメントの簡略版です。

SELECT  Devices.SerialNumber,
    MeterReadings.ScanDateTime,
    MeterReadings.TotalMono,
    MeterReadings.TotalColour

FROM    dbo.MeterReadings AS MeterReadings

JOIN    DBO.Devices AS Devices 
ON      MeterReadings.DeviceID = Devices.DeviceID
WHERE   Devices.serialnumber = 'ANY GIVEN DEVICE SERIAL NUMBER'
AND     Meterreadings.Scandatetime > 'ANY GIVEN SCAN DATE TIME'

ORDER BY MeterReadings.ScanDateTime DESC, Devices.SerialNumber ASC
4

2 に答える 2

2

これは私が最後に使用したコードです

WITH readings AS
(
SELECT
    d.SerialNumber
    , m.TotalMono
    , m.TotalColour
    , m.ScanDateTime
FROM dbo.MeterReadings m
INNER JOIN dbo.Devices d ON m.DeviceId = d.DeviceId
WHERE m.ScanDateTime > '2012-01-01'

) 

SELECT top 1 *
FROM readings r
LEFT JOIN readings p ON p.SerialNumber = r.SerialNumber
                and p.ScanDateTime < r.ScanDateTime
                and p.TotalMono > r.TotalMono
order by r.serialnumber, p.TotalMono desc, r.TotalMono asc
于 2013-03-15T09:23:17.077 に答える
0

このようなことを試してください。

;WITH readings AS
(
    SELECT
        d.SerialNumber
        , m.TotalMono
        , m.TotalColour
        , m.ScanDateTime
    FROM dbo.MeterReadings m
    INNER JOIN dbo.Devices d ON m.DeviceId = d.DeviceId
)

SELECT *
FROM readings r
LEFT JOIN readings p ON p.SerialNumber = r.SerialNumber
                    AND p.ScanDateTime < r.ScanDateTime
WHERE p.reading > r.reading
于 2013-03-14T16:15:07.053 に答える