sql >> データベース >  >> RDS >> PostgreSQL

再帰クエリでは、集計関数は使用できません。このクエリを作成する別の方法はありますか?

    きれいではありませんが、解決策を見つけました:

    WITH RECURSIVE rankings(rankable_type, rankable_id, athlete, value, rank) AS (
      SELECT 'Sport', sport_id, athlete, seconds, RANK() over(PARTITION BY sport_id ORDER BY seconds)
      FROM lap_times lt
    
      UNION ALL
    
      SELECT 'Category', *, rank() OVER(PARTITION by category_id ORDER BY avg_rank) FROM (
        SELECT DISTINCT category_id, athlete, avg(r.rank) OVER (PARTITION by category_id, athlete) AS avg_rank
        FROM categories c
        JOIN memberships m ON m.category_id = c.id
        JOIN rankings r ON r.rankable_type = m.member_type AND r.rankable_id = m.member_id
      ) _
    )
    SELECT * FROM rankings;
    

    クエリの再帰部分で、GROUP BYを呼び出す代わりに avg(r.rank)を計算します 、同じ列に分割されたウィンドウ関数を使用します。これは、平均ランクを計算するのと同じ効果があります。

    1つの欠点は、この計算が必要以上に何度も行われることです。 GROUP BYができたら 次にavg(r.rank)avg(r.rank)よりも効率的です 次にGROUP BY

    ネストされたクエリの結果に重複があるため、DISTINCTを使用しています これらを除外してから、外部クエリがRANK()を計算します 各category_idのすべてのアスリートの これらの平均に基づいています。

    誰かがこれを行うためのより良い方法を知っているかどうか、私はまだ聞きたがっています。ありがとう



    1. サブクエリとマルチテーブル

    2. Oracleでレコードのグループをマージする方法は?

    3. Laravel eloquent-SELECTの前にヒントを追加する方法はありますか?

    4. mysqlのUTCでの日付