下面是示例表
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/