0

我一直是这个论坛的长期读者,它对我有很大帮助,但是我有一个问题我找不到特定于我的要求的解决方案,所以这是我第一次不得不问任何问题。我有一个选择语句,它返回按日期排序的仪表读数(顶部的最新读数),在 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 回答