在日期范围之间查询记录时需要向后拉记录

时间:2016-05-27 07:53:51

标签: java oracle hibernate oracle11g

以下是样本表

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')

1 个答案:

答案 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;