【问题标题】:JavaDB: get ordered records in the subqueryJavaDB:在子查询中获取有序记录
【发布时间】:2011-05-19 20:58:42
【问题描述】:

我的 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_hash 相关。声誉和日期与 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。有人可以为我的问题提出一个可行的解决方案吗?

【问题讨论】:

  • 你如何计算平均声誉?它是所有元组的平均值还是最后 5 个值的平均值
  • 假设子查询是可以接受的,这意味着您只能获得该信誉表中的最后 5 行,这可能意味着公司 A 有 4 个数据点,B 有 1 个数据点,C 没有数据点(假设这是最后 5) - 那么 A 的 avg(Reputation) 超出 4 个数据点,B 超出 1,C 则没有?
  • 是的,你是对的,即使查询被接受,它也不会返回我需要的...

标签: sql sql-order-by subquery offset javadb


【解决方案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 ... 子查询来检索要计算平均值的公司。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多