我有以下代码
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但我不知道,这是最好的办法吗?
发布于 2013-01-04 08:05:35
如果使用Server 2012,则可以使用新的 analytical function
Server 2012引入了新的分析函数LEAD()和new ()。该函数在不使用自联接的情况下访问相同结果集中的后继行(对于铅)和前一行(对于滞后)的数据。
然后你的陈述变成
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,我会将语句写成
;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编辑
将这些解决方案中的任何一个用于您的解决方案的主要区别在于,您的解决方案必须为每个记录检索先前的结果,这是一个昂贵的操作,而该解决方案本质上可以连接两个完整(相同)的数据集。
https://stackoverflow.com/questions/14153075
复制相似问题