0

私はアプリケーション テーブルを持っています。各アプリケーションはアクティビティを持つことができ、アクティビティが更新されるたびに activityupdate テーブルにログが記録されます。

activityupdate テーブル: - id - activity_id - user_id - 日付

アクティビティ テーブル: - id - application_id - ランク - ...

アプリケーションのすべてのアクティビティの最新のアクティビティ更新をアクティビティ ランク順に取得したい

私は持っている

SELECT au
FROM activityupdate au
INNER JOIN activity ac
ON au.activity_id = ac.id
INNER JOIN application ap
ON ac.application_id = ap.id
WHERE ap.id = 3
GROUP BY au, ac.rank
ORDER BY ac.rank ASC

しかし、これは機能しません。GROUP BY で au と ac.rank を設定する必要がある理由がわかりません。

ご協力いただきありがとうございます

編集、ありがとうゴードン、私は解決策を見つける

select *
from (SELECT au,
      row_number() over (partition by au.activity_id order by au.date desc) as seqnum
      FROM activityupdate au INNER JOIN
      activity ac
      ON au.activity_id = ac.id INNER JOIN
      application ap
      ON ac.application_id = ap.id
  WHERE ap.id = 3
  ORDER BY ac.rank ASC
 ) t
where seqnum = 1
4

1 に答える 1

2

集計は必要ありません。関数row_number()は必要なことを行います。partition byグループ (句で定義) 内の行に連続番号を割り当てます。番号の順序は によって決まりorder byます。

whereその後、句を使用して最新のものを選択できます。

select *
from (SELECT au,
             row_number() over (partition by au order by rank desc) as seqnum
      FROM activityupdate au INNER JOIN
           activity ac
           ON au.activity_id = ac.id INNER JOIN
           application ap
           ON ac.application_id = ap.id
      WHERE ap.id = 3
     ) t
where seqnum = 1
于 2013-11-06T03:05:00.247 に答える