2016-04-15 6 views
0

私は出力を得るために2つのデータセットをブレンドしようとしているシナリオがあります。最初のテーブルまたはテーブル1には、2人にルーティングされた割り当てIDがあります。また、これらの人々のscore_idも表示されます。彼らの仕事に割り当てられた彼らの得点と日付も与えられます。カスタムpostgresql

enter image description here表2に、ディスパッチャのスケジューリングの詳細を示します。この例では、20レコードが表示されます。 スケジューリングイベントごとに、表1のres_score_idごとに、ディスパッチャはtable2から上位10個のリソースとそのスコアを検索します。 したがって、res_score_id = 2の場合、テーブル2にはfinal_indx = 2のレコードが最初に表示されます。同様に、res_score_id = 1の場合、table2にはfinal_indx = 1の人が10人います。

私が得たいのは、各トップ10クラスターの最初の人物のディスパッチャーIDと、表2のrow18をExcel10で強調表示したスコアです。

次に、最初のディスパッチャーとperson1(表1)のスコアの差を計算し、同様に2番目のクラスターのトップディスパッチャーのスコアをtable2で取得し、person2(table1)のスコアから差し引きたい。

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

答えて

1

テーブル2のレコードのランクを付けたいとします。結束を考慮する場合はRANK(またはDENSE_RANK)、そうでない場合はROW_NUMBERでこれを行います。ランク1は、final_indxあたりの最善の行です。つまり、スコアが最も高い行で、これを保持するだけです。次に、table1に参加します。

select 
    t1.*, 
    t2.dispatcher_id, 
    t2.dispatcher_score, 
    t2.dispatcher_score - t1.score as delta_score 
from 
(
    select 
    dispatcher_id, 
    dispatcher_score, 
    final_indx, 
    rank() over (partition by final_indx order by dispatcher_score desc) as rnk 
    from table2 
) t2 
join table1 t1 on t1.res_score_id = t2.final_indx 
where t2.rnk = 1; 
+0

Thorsten Kettnerさん、ありがとうございました。 res_score_idで注文を変更して、自分のデータセットに必要なo/pを取得しました。あなたのコードは間違いなく役に立ちました!あなたはロック! – Nemo