2011-05-19 71 views
3

我在JavaDB之外数据库下面的“COMPANIES_BY_NEWS_REPUTATION”(这是一些随机数据只是代表结构)JavaDB之外:在子查询得到有序记录

 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条新闻的平均声誉。为了做到这一点,我以某种方式觉得我需要按照下面的代码所示在子查询中按''和'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

你如何计算平均声誉?它是所有元组中的平均值还是仅仅最后5个值 – kuriouscoder 2011-05-19 21:51:45

+0

只是最后5个值。 – 2011-05-19 21:59:12

+0

让我们假设子查询是可接受的,意味着你只获得该信誉表中的最后5行,这可能意味着公司A有4个数据点,B有1个数据点,C没有(假设这是最后5个) - 那么你的A的平均值(声望)就是4个数据点中的一个,因为B是1,而C是没有的? – 2011-05-20 03:05:03

回答

1

您正在使用哪种版本的JavaDB?根据JavaDB文档中的TableSubquery一章,表子查询确实支持order byfetch 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 ...子查询来检索要为其计算平均值的公司。