我意識到這個問題的標題可能含糊不清,但我不知道如何對其進行定義。我有以下表格:如何根據其他列中值的存在來選擇行
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
如何選擇基礎上,option
列的每個獨特i_id
的值的行:如果'C'
存在,選擇該行,否則選擇行與'A'
使'B'
其他結果集爲:
我意識到這個問題的標題可能含糊不清,但我不知道如何對其進行定義。我有以下表格:如何根據其他列中值的存在來選擇行
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
如何選擇基礎上,option
列的每個獨特i_id
的值的行:如果'C'
存在,選擇該行,否則選擇行與'A'
使'B'
其他結果集爲:
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
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
這對於i_id = 4的情況不適用,其中[options] ='E',OP不希望顯示出來。 – 2011-12-20 18:43:34
謝謝,我解決了它。 – demas 2011-12-20 18:46:51
這會給你的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
嗯,我建議這個問題可以更容易,如果你可以將一個數字「得分」,以每個字母,以便「更好的」字母有更高的分數。然後,您可以使用MAX爲每個組查找選項中具有最高「分數」的行。由於「A」 <「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}
是表(即一個自然的關鍵,沒有兩行將爲這兩列具有相同的值組合;或者,您對該列對具有唯一性約束)。
非常感謝GSerg。所有的答案非常感謝。 – 2011-12-21 13:57:50