2016-04-26 24 views
0

ヌルであっても、前の行からデータを取得しなければならない:SQLのLAG機能JOIN - データは、私は3つのテーブル持っ

1)Calendar

  • このテーブルには、各日付の単一のエントリを有している(これは毎日レコードを持つ大きなテーブルの実際の一部 - 私はこのような状況のために簡略化しています)

2)Reading_Type

  • Reading_Type_ID
  • Type_Name

3)Readings

  • Reading_ID
  • Reading_Type_ID
  • Reading_Date
  • Reading

Reading_Type_IDReading_Dateには1つのエントリしか許可されていませんが、すべての日付に読み取り値があります。

からすべてのデータと昨日の読んだそれのReading_Type_IDを返すクエリが必要です。前日(昨日)は読書を持っていない場合は、Yesterday_Readingは0でなければならない

(その行が> 1日前である場合、それはだけテーブル内の前の行からの読み出しを引っ張らないべきです)。私がこれまで持って何

SELECT 
     r.Reading_ID 
    , r.Reading_Type_ID 
    , r.Reading 
    , r.Reading_Date 
    , LAG(r.Reading, 1, 0) 
     OVER (PARTITION BY r.Reading_Type_ID ORDER BY r.Reading_Date) 
     AS Yesterday_Reading 
FROM 
    Calendar c 
LEFT JOIN 
    Readings r ON c.Date = r.Reading_Date 

このLAG機能はありません厳密に「昨日」から、Readingsテーブルに(日付別)最後の行から引きます。私はいくつかの順列(ORDER BY c.DatecからSELECT節までの行を追加しました)を試しましたが、これを修正する方法はわかりません。

+0

を最初に予想される行数が1000以上でない場合は、このrequirement.Throwにいくつかのサンプルdata.Iは再帰CTEが最良の答えだと思うカレンダーテーブルの必要はありません – KumarHarsh

答えて

1

問題は、Reading_Type_IDごとに完全なカレンダー期間が必要になることです。あなたはこのCROSS JOINを使用して行うことができます。

SELECT r.Reading_ID, rr.Reading_Type_ID, r.Reading, r.Reading_Date, 
     LAG(r.Reading, 1, 0) OVER (PARTITION BY rr.Reading_Type_ID ORDER BY r.Reading_Date 
           ) as Yesterday_Reading 
FROM Calendar c CROSS JOIN 
    (SELECT DISTINCT r.Reading_Type_ID FROM Readings r) rr LEFT JOIN 
    Readings r 
    ON c.Date = r.Reading_Date AND r.Reading_Type_ID = rr.Reading_Type_ID; 
関連する問題