2

次のコードがあります

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 列は次のように前日の値を示します (上記の例では最後の 3 行)

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

しかし、私は知りません、これが最善の方法ですか?

4

1 に答える 1

1

SQL Server 2012 を使用している場合は、新しいLAG分析関数を使用できます

SQL Server 2012 では、新しい分析関数 LEAD() および LAG() が導入されています。この関数は、 self-join を使用せずに、同じ結果セット内の後続の行 (リードの場合) と前の行 (ラグの場合) のデータにアクセスします。

あなたのステートメントは次のようになります

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

SQL 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

編集

これらのソリューションのいずれかを使用する場合の主な違いは、ソリューションがレコードの前の結果を取得する必要があることです。これは高価な操作ですが、このソリューションは本質的に 2 つの完全な (同一の) データ セットを結合できます。

于 2013-01-04T08:05:35.130 に答える