【问题标题】:Bigquery - How to filter records with certain conditionBigquery - 如何过滤具有特定条件的记录
【发布时间】: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。

标签: mysql sql google-bigquery


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多