我的JavaDB数据库中有以下“COMPANIES_BY_NEWS_REPUTATION”(这是一些随机数据来表示结构)
COMPANY | NEWS_HASH | REPUTATION | DATE
-------------------------------------------------------------------
Company A | 14676757 | 0.12345 | 2011-05-19 15:43:28.0
Company B | 454564556 | 0.78956 | 2011-05-24 18:44:28.0
Company C | 454564556 | 0.78956 | 2011-05-24 18:44:28.0
Company A | -7874564 | 0.12345 | 2011-05-19 15:43:28.0
一个news_hash可能与几家公司有关,而公司也可能涉及多个news_hashes。声誉和日期绑定到news_hash。
我需要做的是计算每家公司最近5条新闻的平均声誉。为了做到这一点,我不知何故觉得我需要在子查询中使用'order by'和'offset',如下面的代码所示。
select COMPANY, avg(REPUTATION) from
(select * from COMPANY_BY_NEWS_REPUTATION order by "DATE" desc
offset 0 rows fetch next 5 row only) as TR group by COMPANY;
但是,JavaDB既不允许ORDER BY,也不允许在子查询中使用OFFSET。有人可以为我的问题建议一个有效的解决方案吗?
答案 0 :(得分:1)
您使用的是哪个版本的JavaDB?根据JavaDB文档中的章节TableSubquery,表子查询支持order by
和fetch next
,至少在版本10.6.2.1中。
鉴于可以对子查询进行排序并且可以限制结果集的大小,以下(未经测试的)查询可能会执行您想要的操作:
select COMPANY, (select avg(REPUTATION)
from (select REPUTATION
from COMPANY_BY_NEWS_REPUTATION
where COMPANY = TR.COMPANY
order by DATE desc
fetch first 5 rows only))
from (select distinct COMPANY
from COMPANY_BY_NEWS_REPUTATION) as TR
此查询从COMPANY_BY_NEWS_REPUTATION
检索所有不同的公司名称,然后检索每个公司的最后五个信誉行的平均值。我不知道它是否会充分发挥作用,这可能取决于数据集的大小以及你所拥有的索引。
如果您在另一个表中有唯一公司名称列表,则可以使用该列表而不是select distinct ...
子查询来检索要计算平均值的公司。