3

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 

1 つの news_hash が複数の企業に関連している可能性がある一方で、1 つの企業が複数の 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 も使用できません。誰かが私の問題の有効な解決策を提案してもらえますか?

4

1 に答える 1

1

どのバージョンの JavaDB を使用していますか? JavaDB ドキュメントのTableSubqueryの章によると、少なくともバージョン 10.6.2.1 では、テーブル サブクエリは および をサポートしていますorder byfetch next

サブクエリを並べ替えることができ、結果セットのサイズを制限できることを考えると、次の (テストされていない) クエリで目的が達成される可能性があります。

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取得し、各会社の最新の 5 つの評価行の平均を取得します。それが十分に機能するかどうかはわかりません。それは、データセットのサイズと配置されているインデックスに依存する可能性があります。

別のテーブルに一意の会社名のリストがある場合は、select distinct ...サブクエリの代わりにそれを使用して、平均を計算する会社を取得できます。

于 2011-06-02T17:17:10.557 に答える