I’m trying to write SQL (in BigQuery) the following in order to get a result that satisfies the following conditions. for ex: my table contains the following data
x
id | value
___________|_____________
1 | p
1 | oo
2 | p
4 | p
4 | lop
5 | AA
5 | p
6 | p
6 | p
I want to filter out records where it contains only value as “p” from the table. The expected result would be
2 | p
6 | p
I have tried with the following query but it returns other rows as well (1,p and 1,oo)
SELECT id,value
FROM `ggg.tt.table` where userid in
(
select id from (SELECT id,COUNT(distinct value )as cnt
from (select * FROM `ggg.tt.table` where trim(value) = 'p'
)group by 1 having cnt = 1))
can someone help how to achieve this using bigquery ?
Advertisement
Answer
You can count the distinct values for every id
CREATE TABLE tab1
(`id` int, `value` varchar(3))
;
INSERT INTO tab1
(`id`, `value`)
VALUES
(1, 'p'),
(1, 'oo'),
(2, 'p'),
(4, 'p'),
(4, 'lop'),
(5, 'AA'),
(5, 'p'),
(6, 'p'),
(6, 'p')
;
SELECT DISTINCT id
FROm tab1 t1
WHERE `value` = 'p' AND (SELECT COUNT(DISTINCT `value`) FROM tab1 WHERE id = t1.id) = 1
| id | | -: | | 2 | | 6 |
db<>fiddle here