2016-10-05 9 views
0

次の表を参照してください。テーブルからの複数の列に基づいてレコードを取得する方法

enter image description here

上記の表から、私はLN_LOAN_IDとBR_IDあたりの中東BFS_SCOREを選択します。単一のスコアでいくつかのLN_LOAN_IDがあります。

上記の表の例として、必要な出力は次のとおりです。

enter image description here

私はこれを実現する方法を教えてください。

+0

どのようなデータベースをお使いですか?また、おそらく "中間" bfs_scoreではなく中央値が必要です。 –

+0

上記の例で示したように、LN_LOAN_IDあたり2つのBR_IDがあり、奇数ではない場合はどうなりますか? – woodhead92

+0

@KamilG。、私はSQL 2012を使用しています。私はスコアのメダインは使用できません。要件は、スコアが2つ以上ある場合は中間スコアを取得し、スコアが2つの場合は最小スコアを使用することです。 – jambai

答えて

0

LN_LOAD_ID, BR_IDのユニークペアに2つのスコアがある場合を処理するには、BFS_SCOREの中間値がないため、中央値が必要です。


のPostgresソリューション:次に、あなたのクエリは、このような単純なになります

CREATE OR REPLACE FUNCTION _final_median(NUMERIC[]) 
    RETURNS NUMERIC AS 
$$ 
    SELECT AVG(val) 
    FROM (
    SELECT val 
    FROM unnest($1) val 
    ORDER BY 1 
    LIMIT 2 - MOD(array_upper($1, 1), 2) 
    OFFSET CEIL(array_upper($1, 1)/2.0) - 1 
    ) sub; 
$$ 
LANGUAGE 'sql' IMMUTABLE; 

CREATE AGGREGATE median(NUMERIC) (
    SFUNC=array_append, 
    STYPE=NUMERIC[], 
    FINALFUNC=_final_median, 
    INITCOND='{}' 
); 

Postgres wiki以下の中央値集計関数を作成します

select 
    ln_load_id, 
    median(bfs_score) as bfs_score 
    br_id 
from yourtable 

しかし、トリッキーな部分はウィットに来るh score_order。ペアが2つあり、中央値ではなく中央値が実際に必要な場合は、計算されたスコアの行がないため、nullになります。それ以外の場合は、テーブルに戻って「中」の列を検索してください:

select 
    t1.ln_load_id, t1.bfs_score, t1.br_id, t2.score_order 
from (
    select 
    ln_load_id, 
    median(bfs_score) as bfs_score 
    br_id 
    from yourtable 
) t1 
    left join yourtable t2 on 
    t1.ln_load_id = t2.ln_load_id 
    and t1.br_id = t2.br_id 
    and t1.bfs_score = t2.bfs_score 
関連する問題