【问题标题】:SQL Comparison to a value in the next rowSQL 与下一行中的值进行比较
【发布时间】:2013-03-03 02:12:06
【问题描述】:

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

【问题讨论】:

    标签: compare row next


    【解决方案1】:

    这是我最后使用的代码

    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
    

    【讨论】:

      【解决方案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
      )
      
      SELECT *
      FROM readings r
      LEFT JOIN readings p ON p.SerialNumber = r.SerialNumber
                          AND p.ScanDateTime < r.ScanDateTime
      WHERE p.reading > r.reading
      

      【讨论】:

      • 感谢您的回复,我是否遗漏了一些内容,但数据是否需要按 scandatetime 进行 Desc 排序才能正常工作?
      • 感谢您的建议,我稍微调整了一下,它给了我正确的结果:仅供参考
      猜你喜欢
      • 2016-10-14
      • 2011-02-08
      • 2013-07-14
      • 1970-01-01
      • 2021-09-20
      • 2021-11-05
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多