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