以下是样本表
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
.....
现在,我的服务正在查询日期01-DEC-2015到2015年12月10日之间的ID 1,2,3(也可能更多)的评级。如果我进行选择查询以拉出此范围内的记录,则只有一条记录是05-DEC-2015。
因此,在JAVA方面,我可以使用它来填充相同的数据直到10-DEC,因为这是适用的。但是为了向后填充,我需要为每个ID提取先前的记录(在01-DEC-2015之前只记录一条记录,在此日期之前可能有n条记录),这对于所有ID都不一定在同一日期。有些人可以帮我查询一下,或者如果查询完全不可能,那么请使用SP。
要求的输出如下; 2015年12月1日至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
由于开始日期(01-12-2015)没有评级,我需要为每个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')
答案 0 :(得分: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;