SQL获取行值之间的差异?

SQL获取行值之间的差异?,sql,sql-server,Sql,Sql Server,我有以下代码 SELECT MRT.sno, MRT.TypeName, MR.Adate, MAX(MRD.Value) AS Value FROM MeterReadings MR INNER JOIN MeterReadingDetails MRD ON MRD.ReadingId = MR.sno INNER JOIN MeterReadingTypes MRT ON MRT.sno = MRD.ReadingTypeId WHERE MRT.sno IN (7,10,11) GROU

我有以下代码

SELECT MRT.sno, MRT.TypeName, MR.Adate, MAX(MRD.Value) AS Value
FROM MeterReadings MR 
INNER JOIN MeterReadingDetails MRD ON MRD.ReadingId = MR.sno
INNER JOIN MeterReadingTypes MRT ON MRT.sno = MRD.ReadingTypeId
WHERE MRT.sno IN (7,10,11)
GROUP BY MRT.sno,MRT.TypeName,MR.Adate
ORDER BY MR.Adate DESC
和结果

sno TypeName                Adate                   Value

11  Toplam Kapasitif        2013-01-04 00:00:00     33,313
7   Toplam                  2013-01-04 00:00:00     7819,33
10  Toplam Reaktif          2013-01-04 00:00:00     640,492
11  Toplam Kapasitif        2013-01-03 00:00:00     33,276
7   Toplam                  2013-01-03 00:00:00     7805,934
10  Toplam Reaktif          2013-01-03 00:00:00     639,862
我需要一个名为OldValue的附加列。OldValue列显示前一天的值,如上面示例中的后三行

33,276
7805,934
639,862
null
null
null
我该怎么做?也许有一个类似的例子给我指路

先谢谢你

更新

事实上,我写了这样的东西

SELECT MRT.sno, MRT.TypeName, MR.Adate, MAX(MRD.Value) AS Value, 

(SELECT Value From
    (SELECT TOP 1 XMR.Adate,XMRD.ReadingTypeId,MAX(XMRD.Value) AS Value 
    FROM MeterReadings XMR,MeterReadingDetails XMRD 
    WHERE XMRD.ReadingId = XMR.sno AND XMRD.ReadingTypeId = MRT.sno AND XMR.Adate<MR.Adate 
    GROUP BY XMR.Adate,XMRD.ReadingTypeId 
    ORDER BY XMR.Adate DESC) AS TBL
) AS OldValue

FROM MeterReadings MR 
INNER JOIN MeterReadingDetails MRD ON MRD.ReadingId = MR.sno
INNER JOIN MeterReadingTypes MRT ON MRT.sno = MRD.ReadingTypeId
WHERE MRT.sno IN (7,10,11)
GROUP BY MRT.sno,MRT.TypeName,MR.Adate

但是我不知道,这是最好的方法吗?

如果您使用的是SQL Server 2012,您可以使用新的

SQL Server 2012引入了新的分析函数LEAD and LAG。 此函数用于访问潜在客户和潜在客户的后续行中的数据 同一结果集中滞后的前一行,不使用 自连接

你的陈述就变成了

SELECT  *, LAG(Value) OVER (PARTITION BY sno ORDER BY Adate DESC)
FROM    (
          SELECT  MRT.sno, MRT.TypeName, MR.Adate, MAX(MRD.Value) AS Value, 
          FROM    MeterReadings MR 
                  INNER JOIN MeterReadingDetails MRD ON MRD.ReadingId = MR.sno
                  INNER JOIN MeterReadingTypes MRT ON MRT.sno = MRD.ReadingTypeId
          WHERE   MRT.sno IN (7,10,11)
          GROUP BY
                  MRT.sno,MRT.TypeName,MR.Adate
        ) q
ORDER BY
        Adate DESC
使用SQLServer2005/2008,我将按照

;WITH q AS (
  SELECT  MRT.sno, MRT.TypeName, MR.Adate, MAX(MRD.Value) AS Value, rn = ROW_NUMBER() OVER (PARTITION BY MRT.sno ORDER BY MR.Adate DESC)
  FROM    MeterReadings MR 
          INNER JOIN MeterReadingDetails MRD ON MRD.ReadingId = MR.sno
          INNER JOIN MeterReadingTypes MRT ON MRT.sno = MRD.ReadingTypeId
  WHERE   MRT.sno IN (7,10,11)
  GROUP BY
          MRT.sno,MRT.TypeName,MR.Adate
)
SELECT  q1.*, q2.Value
FROM    q q1
        LEFT OUTER JOIN q q2 ON q2.sno = q1.sno AND q2.rn = q1.rn + 1
编辑


将这些解决方案中的任何一个用于您的解决方案之间的主要区别在于,您的解决方案必须为每个记录检索以前的结果,这是一个昂贵的操作,而这些解决方案本质上可以连接两个完全相同的数据集。

使用MAXMRD.Value正确吗?一般来说,这与阿达特先生无关。非常感谢。我还不能理解你的代码,但它比我的代码好。@AliRızaAdıyahşI-你使用的是SQL Server 2012还是2005/2008?你遇到问题的部分是什么?你的代码没有问题。我是sql新手,所以我不能完全理解你的代码。我现在正在检查你的代码。如果你在某个部分卡住了,你可以问。