2016-05-27 16 views
0

は、以下のサンプルテーブルである一方、後方レコードをプルする必要があるは、日付範囲の間でレコードを照会

今私のサービスは、ID 1、2のための評価を問い合わせるれ
id date   rating 
----------------------- 
1 15-11-2015 A 
1 18-11-2015 A 
1 05-12-2015 B 
2 05-11-2015 A 
2 21-11-2015 A 
2 05-12-2015 A 
3 25-11-2015 B 
3 05-12-2015 B 
    ..... 

、3日間(も数でより多くのことができます) 01-DEC-2015〜10-DEC-2015この範囲内のレコードを取得するためにselectクエリを実行すると、05-DEC-2015のレコードは1つだけです。

JAVA側では、10-DECまで同じデータを入力することができます。逆の記入をするためには、必ずしもすべてのIDに対して同じ日付ではない各IDについて、以前のレコードを引き出す必要があります(01-DEC-2015より前のレコードを1つだけ取り出します)。これについての質問や質問がすべて可能ではない場合は、SPを使って私に手伝ってください。

必要な出力は以下のとおりです。開始日(2015年1月12日)の格付けがないとして2015年1月12日

1,2- IDの2015年10月12日に
1 18-11-2015 A 
    1 05-12-2015 B 
    2 21-11-2015 A 
    2 05-12-2015 A 

間の評価のために、私は、各IDの前の評価を引っ張っする必要があります。

最初は次のように試しました。これは、評価日がすべてのIDで同じであってもうまくいきましたが、残念ながらそうではありません。

Select * 
from ratings rr 
where rr.id in (1, 2) 
    and rr.date between (Select max(rrr.date) 
         from ratings rrr 
         where rrr.date <= to_date('01-12-2015','dd-MM-yyyy')) 
        and to_date('10-12-2015','dd-MM-yyyy') 
+2

あなたは必要な結果を投稿できますか? – Aleksej

+0

質問を必要な出力で更新しました。 – mani

答えて

1

私はあなたの要求が正しい持ちの場合 - あなたは、各id値の与えられた範囲の間で結果を取得したいと、idあたり少なくとも2つの行が存在しない場合があるまで、この範囲の前から行を取得idあたり2行

あなたはROW_NUMBER()分析関数にdate範囲内にあるOR行をフィルタリングすることにより、これを行うことができます。:

SELECT id, 
     "date", 
     rating 
FROM (
    SELECT id, 
     "date", 
     rating, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY "date" DESC) AS rn 
    FROM ratings 
    WHERE "date" <= DATE '2015-12-10' 
    AND id  IN (1, 2) 
) 
WHERE "date" >= DATE '2015-12-01' 
OR rn <= 2; 

要件は、範囲内のすべての行を取得しても、正確に1行としている場合その範囲の前の最新の日付は、UNIONを使用して行うことができます:

SELECT id, 
     "date", 
     rating 
FROM ratings 
WHERE "date" BETWEEN DATE '2015-12-01' AND DATE '2015-12-10' 
AND id IN (1, 2) 
UNION ALL 
SELECT id, 
     "date", 
     rating 
FROM (
    SELECT id, 
     "date", 
     rating, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY "date") AS rn 
    FROM ratings 
    WHERE "date" < DATE '2015-12-01' 
    AND id IN (1, 2) 
) 
WHERE rn = 1; 
+0

これは本当に有用です。私のシナリオは2番目ですが、実際には2つの異なるソースからデータが来ているので、2つの組合とのクエリは非常に複雑です。この範囲外であれば、増分行数を定義できるいくつかの分析関数を手伝ってください。あなたがサブクエリファクタリング句を使用することができるように、私は1つだけ – mani

+0

を選ぶことができます: 'WITH ratings(id、" date "、rating)AS( MT0

関連する問題