首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL得到行值之间的差异?

SQL得到行值之间的差异?
EN

Stack Overflow用户
提问于 2013-01-04 07:38:48
回答 1查看 1.1K关注 0票数 2

我有以下代码

代码语言:javascript
复制
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

和结果

代码语言:javascript
复制
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列显示前一天的值,如下所示(上面示例的最后三行)

代码语言:javascript
复制
33,276
7805,934
639,862
null
null
null

我该怎么做?也许有一个类似的例子可以为我指明方向。

提前谢谢..。

更新

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

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 08:05:35

如果使用Server 2012,则可以使用新的 analytical function

Server 2012引入了新的分析函数LEAD()和new ()。该函数在不使用自联接的情况下访问相同结果集中的后继行(对于铅)和前一行(对于滞后)的数据。

然后你的陈述变成

代码语言:javascript
复制
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

使用Server 2005/2008,我会将语句写成

代码语言:javascript
复制
;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

编辑

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14153075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档