2013-03-14 31 views
0

我一直是這個論壇的很長一段時間的讀者,它幫助了我很多,但是我有一個問題,我無法找到特定於我的需求的解決方案,所以這是第一次我不得不問什麼。 我有一個select語句,它返回按日期排序的儀表讀數(最新的讀數在頂部),在99.9%的情況下,隨着日期的推移,儀表讀數總是上升,但由於偶爾會出現系統故障,需要識別下面一行中的讀數(之前的讀數)大於最新讀數(當前單元格)的實例 我遇到了LEAD函數,但它僅在Oracle或SS-MS-2012中使用,我正在使用SS-MS-2008。 這裏是我的選擇陳述的簡化版本:SQL與下一行的值比較

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 

回答

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 
+0

感謝您的回覆,我失去了與一些使用的代碼,但犯規數據需要被scandatetime這個排序說明工作? – TBC 2013-03-14 16:46:41

+0

感謝您的建議,我調整了一下,它給了我正確的結果:FYI – TBC 2013-03-15 09:20:46

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