【问题标题】:Need to pull backward records while querying records between date range查询日期范围之间的记录时需要向后拉记录
【发布时间】:2016-09-25 11:05:50
【问题描述】:

下面是示例表

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

【问题讨论】:

  • 你能发布你需要的结果吗?
  • 我已经用所需的输出更新了我的问题。

标签: java oracle hibernate oracle11g


【解决方案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;

【讨论】:

  • 这真的很有帮助。我的场景是第二个,但实际上我的查询非常复杂,有两个联合,因为数据来自两个不同的来源。如果超出范围,您能否帮我提供一些可以定义增量行号的分析函数。所以我只能选择一个
  • 听起来您可以使用子查询分解子句:WITH ratings ( id, "date", rating ) AS ( &lt;YOUR_COMPLICATED_QUERY&gt; ) &lt;MY_QUERY_WITH_THE_UNION&gt;
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多