2011-12-20 10 views
2

私はこの質問のタイトルが曖昧であるかもしれないと認識していますが、どのようにフレーズするかわかりません。私はそれぞれのユニークなi_idについてoption列の値に基づいて行を選択するにはどうすればよい他の列の値の存在に基づいて行を選択する方法

i_id option p_id 
---- ------ ---- 
1  A  4 
1  B  8 
1  C  6 
2  B  3 
2  C  5 
3  A  7 
3  B  3 
4  E  11 

'C'が存在する場合は、そのため'A'と他'B'で行、他の選択行を選択し、私は次の表を持っています結果セットは次のとおりです。

​​

答えて

2
select i_id, option, p_id 
from (
    select 
    i_id, 
    option, 
    p_id, 
    row_number() over (partition by i_id order by case option when 'C' then 0 when 'B' then 1 when 'A' then 2 end) takeme 
    from thetable 
    where option in ('A', 'B', 'C') 
) foo 
where takeme = 1 
+0

多くのありがとうGSerg。すべての答えはとても感謝しています。 –

1
create table t2 (
    id int, 
    options varchar(1), 
    pid int 
) 

insert into t2 values(1, 'A', 4) 
insert into t2 values(1, 'B', 8) 
insert into t2 values(1, 'C', 6) 
insert into t2 values(1, 'E', 7) 

select t2.* from t2, 
(select id, MAX(options) as op from t2 
where options <> 'E' 
group by id) t 
where t2.id = t.id and t2.options = t.op 
+0

これはi_id = 4の場合には機能しません。[options] = 'E'の場合、OPはそれを表示したくありません。 –

+0

ありがとう、私はそれを修正しました。 – demas

2

これはあなたに除去しながらC、B、A、によって順序付けされた値が得られますこれらの値のいずれも持たないny i_idレコード。

WITH ranked AS 
(
    SELECT i_id, [option], p_id 
     , ROW_NUMBER() OVER (PARTITION BY i_id ORDER BY CASE [option] 
                 WHEN 'C' THEN 1 
                 WHEN 'B' THEN 2 
                 WHEN 'A' THEN 3 
                 ELSE 4 
                 END) AS rowNumber 
    FROM yourTable 
    WHERE [option] IN ('A', 'B', 'C') 
) 
SELECT r.i_id, r.[option], r.p_id 
FROM ranked AS r 
WHERE r.rowNumber = 1 
1

まあ、私はあなたが「より良い」の文字がより高いスコアを有するように、各文字に数値の「スコア」を割り当てることができれば、この問題は簡単に行うことができることを示唆しています。次に、MAXを使用して、各グループに対して、オプションの「得点」が最も高い行を見つけ出すことができます。 「」<「B」<「C」ので、私たちはここにカンニングができ、スコアとしてオプションを使用し、ひいては:

SELECT t1.i_id, t1.option, t1.p_id 
    FROM thetable t1 
    INNER JOIN (SELECT t2.i_id, MAX(option) 
       FROM thetable t2 
       GROUP BY t2.i_id) AS maximums 
     ON t1.i_id = maximums.i_id 
WHERE option != 'D' 

をこれは{i_id, option}は、テーブルの自然キー(すなわち、ノーそのあることを前提としてい2つの行は、その2つの列の値の同じ組み合わせを持つか、またはその列のペアに一意性制約があることになります)。

関連する問題