java - 查询日期范围内的记录时需要向后拉记录

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

现在,我的服务正在查询 2015 年 12 月 1 日至 2015 年 12 月 10 日期间 id 1、2、3(数量也可能更多)的评分。如果我进行选择查询来提取此范围内的记录,则只有一条记录是 2015 年 12 月 5 日的记录。

因此,在 JAVA 方面,我可以使用它来填充相同的数据,直到 10 月 10 日适用。但为了向后填充,我需要为每个 ID 提取先前的记录(仅提取 2015 年 12 月 1 日之前的一条记录,在此日期之前可能有 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

由于开始日期(2015 年 12 月 1 日)没有评级,我需要为每个 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')

最佳答案

如果我的要求正确 - 您希望获得每个 id 值的给定范围之间的结果,并且每个 id 至少没有两行然后获取此范围之前的行,直到每个 id 有两行。

您可以通过过滤 ROW_NUMBER() 分析函数 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;

如果要求获取范围内的所有行以及最新日期在范围之前的一行,那么您可以使用 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;

关于java - 查询日期范围内的记录时需要向后拉记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37477871/

相关文章:

java - 在java中读取.class文件

java - OkHttpClient 限制连接数?

java - Selenium Webdriver (Java) - 元素计数

java - 如何有效地将 TreeSet 的一部分保存到文件中?并重新加载它? (Java问题)

sql - 如何在 PL/SQL 中查找字符串中不同字符的数量和名称

sql-server - 来自 MSSQL > ORACLE 的链接服务器存储过程调用

mysql - ORA-00979 : not a GROUP BY expression for Oracle but not valid for MySQL in context of clause difference

java - 不将实体持久保存到数据库

java - HQL 更新和域对象

java - 集成 JPA2.0 和 Spring