2016-05-27 44 views
0

下面是示例表需要拉向後記錄在查詢日期範圍之間記錄

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 
    ..... 

現在我的服務查詢有關評級ID 1,2,3(可能是數量也更多)日期之間2015年12月1日至2015年12月10日。如果我選擇查詢來提取此範圍內的記錄,則只有一條記錄是2015年12月5日。

所以在JAVA方面,我可以使用它來填充相同的數據,直到10-DEC爲止。但是對於後向填充,我需要拉取以前的記錄(在2015年12月1日之前拉一條記錄,在此日期之前可能有n條記錄),每個ID對於所有的Ids必然不是同一日期。有些人可以幫我查詢一下,或者如果查詢根本不可能,那麼用SP。

要求輸出如下;對於2015年1月12日之間的評級,2015年10月12日ID 1,2

1 18-11-2015 A 
    1 05-12-2015 B 
    2 21-11-2015 A 
    2 05-12-2015 A 

,因爲沒有評級的開始日期(2015年1月12日),我需要拉先前費率爲每個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然後讓行至少兩排在此之前的範圍,直到有每個ID兩行。

您可以通過在ROW_NUMBER()解析函數的過濾做到這一點OR行作爲date範圍內:

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; 

如果要求從範圍內得到的所有行,也正是一個與行該範圍之前的最新日期,那麼你可以使用它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

這真的很有幫助。我的情況是第二個,但實際上我的查詢與兩個工會非常複雜,因爲數據來自兩個不同的來源。你能幫我解決一些可以定義增量行數的分析函數嗎?所以我可以只挑一個 – mani

+0

聽起來就像你可以使用子查詢分解子句:WITH評級(id,「date」,rating)AS( MT0

相關問題