SQL与下一行中的值进行比较

时间:2013-03-14 15:59:38

标签: compare row next

我一直是这个论坛的长期读者,它给了我很多帮助,但是我有一个问题,我无法找到一个特定于我的要求的解决方案,所以这是我第一次不得不提出任何问题。 我有一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
相关问题