Bigquery - 如何过滤具有特定条件的记录
Posted
技术标签:
【中文标题】Bigquery - 如何过滤具有特定条件的记录【英文标题】:Bigquery - How to filter records with certain condition 【发布时间】:2021-09-13 14:30:44 【问题描述】:我正在尝试编写以下 SQL(在 BigQuery 中)以获得满足以下条件的结果。 例如:我的表包含以下数据
id | value
___________|_____________
1 | p
1 | oo
2 | p
4 | p
4 | lop
5 | AA
5 | p
6 | p
6 | p
我想从表中过滤掉仅包含“p”值的记录。 预期的结果是
2 | p
6 | p
我已尝试使用以下查询,但它也返回其他行(1,p 和 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))
有人可以帮助如何使用 bigquery 实现这一目标吗?
【问题讨论】:
如果这是用于bigquery,为什么将其标记为mysql?请仅标记您实际使用的 DBMS。 【参考方案1】:使用下面的方法
select id
from `ggg.tt.table`
group by id
having countif(value != 'p') = 0
如果应用于您问题中的样本数据 - 输出是
如果我想要列“值”以及结果
如果由于某种原因您在输出中需要 value
- 即使根据您的情况定义它始终是 p
- 请考虑以下
select id, any_value(value) value
from `ggg.tt.table` t
group by id
having countif(t.value != 'p') = 0
有输出
【讨论】:
如果我想要列“值”以及结果 在你的情况下,值是已知的,所以你可以添加`'p'作为值` - 对吧? @bigd - 根据定义,该值始终为'p'
,那么为什么需要包含该值?【参考方案2】:
您可以计算每个 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') ;
|编号 | | -: | | 2 | | 6 |SELECT DISTINCT id FROm tab1 t1 WHERE `value` = 'p' AND (SELECT COUNT(DISTINCT `value`) FROM tab1 WHERE id = t1.id) = 1
db小提琴here
【讨论】:
【参考方案3】:这是另一种可能的解决方案:
SELECT DISTINCT id,value
FROM `ggg.tt.table`
WHERE TRIM(value) = 'p' AND
id NOT IN (SELECT id FROM `ggg.tt.table` WHERE TRIM(value) != 'p')
【讨论】:
这将导致其他不需要的值以及 id |价值 ________|_____________ 1 |第 1 页 |哦 你测试了吗?我在与您提供的相同值上运行它并得到了所需的结果:2,p 6,p【参考方案4】:WITH
cte AS (
select 1 as Id ,'p' as value union all
select 1 as Id ,'p' as value union all
select 1 as Id ,'oo' as value union all
select 2 as Id ,'p' as value union all
select 4 as Id ,'p' as value union all
select 4 as Id ,'lop' as value union all
select 5 as Id ,'AA' as value union all
select 5 as Id ,'p' as value union all
select 6 as Id ,'p' as value union all
select 6 as Id ,'p'
),
cte2 AS (
SELECT
id,
value
FROM
cte
WHERE
value != 'p' )
SELECT
id,
count(distinct value)
FROM
cte
WHERE
id NOT IN (
SELECT
id
FROM
cte2)
group by id
【讨论】:
以上是关于Bigquery - 如何过滤具有特定条件的记录的主要内容,如果未能解决你的问题,请参考以下文章