简体   繁体   中英

SQL Comparison to a value in the next row

I have been a long time reader of this forum, it has helped me a lot, however I have a question which I cant find a solution specific to my requirements, so this is the first time I have had to ask anything. I have a select statement which returns meter readings sorted by date (the newest readings at the top), in 99.9% of cases the meter readings always go up as the date moves on, however due to system errors occasionally some go down, I need to identify instances where the reading in the row below (previous reading) is GREATER than the latest reading (Current cell) I have come across the LEAD function, however its only in Oracle or SS-MS-2012, I'm using SS-MS-2008. Here is a simplified version of my select statment:

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

This is the code I used in the end

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

Try something like this.

;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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM