2016-09-22 12 views
0

service_id、professional_id、およびavg(rating)の3つの列を持つビューを作成しましたが、このビューは正常に動作しています。グループ化機能とグループ化機能はありますか?

CREATE VIEW nota_profissionais 
AS 
    SELECT 
     service_id, professional_id, avg(nota) AS nota_media 
    FROM 
     avaliacao, servico_executado, solicitacao 
    WHERE 
     avaliacao.service_id = servico_executado.id 
     AND servico_executado.id_solicitacao = solicitacao.id 
    GROUP BY 
     service_id, professional_id; 

は今、各service_idのためには、(サービスの各タイプ)を返し、私は最高の平均評価を持っているプロを表示する必要があります。私はこれをやってみました:

SELECT 
    service_id, professional_id, MAX(nota_media) AS nota_media 
FROM 
    nota_profissionais 
GROUP BY 
    service_id, professional_id; 

しかし、それはのservice_id毎にすべてのprofessional_idを示す、ビューからまったく同じことを返します。私はそれがなぜ起こっているのか知っていますが、このクエリを正しく行う方法を知らないのです。申し訳ありませんが私は明確でない場合、英語は私の母国語ではありません。

+3

今日のヒント:現代的で明示的な 'JOIN'構文に切り替えましょう! (エラーなし)、読みやすく、外部結合に変換するのが簡単です(必要な場合) – jarlh

答えて

0

あなたはLATERALサブクエリでそれを行うことができます。

SELECT * 
FROM 
    (SELECT DISTINCT service_id FROM nota_profissionais) t1, 
    LATERAL (SELECT professional_id, nota_media 
      FROM nota_profissionais 
      WHERE service_id=t1.service_id 
      ORDER BY nota_media DESC LIMIT 1) t2 

これは、すべての個別service_id秒(最初のサブクエリ)を見つけるだろうし、それらのそれぞれについて、それは最高のプロ(第2副問合せを見つけるだろう、 LATERALのもの)。あなたは多くのデータを持っている場合は

、あなたが(service_id, nota_media DESC)にインデックスを持っていることを確認してください。

+0

FROMの各項目のクエリを「再実行」する必要はありませんか?このように思えるのは、ウィンドウ処理ソリューションよりもはるかに遅いですが、私はテストするDBを持っていません。非常にかわいいトリックtho。 – Hogan

+0

aswerのおかげで、それはトリックをしました。私は横結合の文書を調べます。 –

+0

@ S.Costa私は状態を忘れていました、あなたは今再試行できますか? – redneb

1

これを行うには、ウィンドウ関数を使用することができます。

SELECT service_id, professional_id, nota_media, 
FROM (
    SELECT service_id, professional_id, nota_media, 
     ROW_NUMBER() OVER (PARTITION BY service_id ORDER BY nota_media DESC) as RN 
) x 
WHERE RN = 1 
+0

助けてくれてありがとう –

0

私は最善のアプローチはDISTINCT ONだと思う:

SELECT DISTINCT ON (service_id) np.* 
FROM nota_profissionais np 
ORDER BY service_id, nota_media DESC; 

だけでなく、クエリの長​​さが短いですが、DISTINCT ONは、多くの場合、よりよい持っています他の方法と比較してパフォーマンスが向上します。

0

が同じ最高の定格を持ついくつかの専門家があり、あなたはそれらのすべてを、取得したい場合だけでなく、最初のランダム:ROW_NUMBER()を変更した場合

select t.* 
from nota_profissionais t 
    join (
    select service_id, max(nota_media) as nota_media 
    from nota_profissionais 
    group by service_id) t1 
    on (t.service_id = t1.service_id and t.nota_media = t1.nota_media) 

が実際に同じ結果が@ホーガンの答えを返す必要がありますRANK()機能に追加します。

関連する問題