[英]sql excluding certain results
可以說我有一個數據集
A B
-- --
a 1
b 1
c 1
d 1
d 2
e 1
f 1
f 2
g 1
如果B列中A列的值相同,則B列的值分別為1和2時,我如何排除B列的結果?
我希望我的結果看起來像這樣
A B
-- --
a 1
b 1
c 1
d 2
e 1
f 2
g 1
在此顯式檢查值1和2,並使用它們中恰好有兩個的事實。 如果可以安全地假設您始終想要最高的價值,那么您可能會減少繁瑣的工作。
select
tbl.A,
tbl.B
from
Table1 tbl
left outer join (
select
A
from
Table1
where
B in (1,2)
group by
A
having
count(B) = 2
) mlt on tbl.A = mlt.A
where
(
mlt.A is not null
and tbl.B = 2
) or (
mlt.A is null
and tbl.B = 1
)
對於示例數據和所需結果,要獲得結果的最簡單查詢將是GROUP BY
操作和聚合函數。
SELECT d.A
, MAX(d.B) AS B
FROM my_data_set d
GROUP BY d.A
ORDER BY d.A
如果我們只對B
列中具有1
或2
行感興趣,則可以添加WHERE
子句
SELECT d.A
, MAX(d.B) AS B
FROM my_data_set d
WHERE d.B IN (1,2)
GROUP BY d.A
ORDER BY d.A
對於示例數據,輸出是相同的。
這兩個語句均達到指定的結果。 (有在每個不同的值只有一行返回A
)。
或者,對於相同的示例數據,我們可以使用規范的更多文字實現返回相同的結果集。
要在A
值相同的行包含2
時排除行1
,我們可以使用NOT EXISTS
謂詞和相關子查詢。
SELECT d.A
, d.B
FROM my_data_set d
WHERE ( d.B = 2 )
OR ( d.B = 1 AND
NOT EXISTS ( SELECT 1
FROM my_data_set e
WHERE e.A = d.A
AND e.B = 2
)
)
ORDER BY d.A, d.B
select
* from tbl where a IN
(
select
a from tbl
group by a
having count(*)>1
)
and b!=1
UNION ALL
select
* from tbl where a IN
(
select
a from tbl
group by a
having count(*)=1
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.