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')
;
SELECT DISTINCT id 
FROm  tab1 t1 
WHERE `value` = 'p' AND (SELECT COUNT(DISTINCT `value`) FROM tab1 WHERE id = t1.id)  = 1
|编号 | | -: | | 2 | | 6 |

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 - 如何过滤具有特定条件的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何根据某些过滤条件从 bigquery 导出数据

在 C# 中插入具有重复记录列的 BigQuery 行

按 bigquery 中的 REPEATED 值过滤

如果一个数组包含使用 BigQuery 的另一个数组的所有值,我如何过滤行?

vb.net如何获得具有特定条件的值

如何在标准 SQL 的 BigQuery 中过滤具有 iso 周值的列?