【问题标题】:Counting Unique Records With WHERE AND clause?使用 WHERE AND 子句计算唯一记录?
【发布时间】:2019-05-12 22:04:24
【问题描述】:

我有一张像这样的表


    id         |  segment_name
    ----------------------------------
    1          |  seg_1
    ----------------------------------
    2          |  seg_2
    ----------------------------------
    1          |  seg_2
    ----------------------------------
    3          |  seg_1
    ----------------------------------
    1          |  seg_3

我希望能够将 2 个segment_names 插入 SQL 语句中以查找唯一 ID 的计数。因此,例如,如果我在 SQL 中传入seg_1seg_2,则这是所需的输出:

    count     
    ----------------------------------
    1        
    ----------------------------------

我只计算属于我定义的 2 个segment names 的唯一 ID。

最终我正在寻找段重叠计数。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    对于您最初的问题,您只需要count(distinct)

    select count(distinct id)
    from t
    where segment_name in ('seg_1', 'seg_2');
    

    对于修改后的问题:

    select count(*)
    from (select id
          from t
          where segment_name in ('seg_1', 'seg_2')
          group by id
          having count(*) = 2
         ) i;
    

    【讨论】:

    • IN 不做 OR 吗?所以可能有成员只在一个段中而不在另一个段中,IN 语句会计算它们吗?
    • @TjTate 。 . .是的,这就是问题所要求的。三个 id 有一个或另一个段。只有一个id 具有两个段。如果您有其他问题,请将其作为问题提出。
    • @TjTate 。 . .在两个人解决了回答原始问题的麻烦(都正确)之后,您更新了问题。您已使答案无效,并且可能会吸引反对票。
    • 哦,这个答案现在更有意义了。是的,我正要根据问题的预期输出否决一个不正确的答案。
    【解决方案2】:

    这是您需要的查询吗?

    select count(distinct id)
    from t
    where segment_name in ('seg_1', 'seg_2')
    

    你改变了问题。我认为这个查询将回答新的:

    select count(distinct a.id)
    from (
      select id from t where segment_name = 'seg_1'
    ) a join (
      select id from t where segment_name = 'seg_2'
    ) b on a.id = b.id
    

    【讨论】:

    • 是的,我做到了。累了,没有想清楚道歉!
    【解决方案3】:

    BigQuery 标准 SQL 的另一个选项

    #standardSQL
    
    SELECT COUNT(DISTINCT id) `count` FROM (
      SELECT id, COUNT(1) OVER(PARTITION BY id) cnt
      FROM `project.dataset.table`
      WHERE segment_name IN ('seg_1', 'seg_2')
    ) WHERE cnt > 1  
    

    它使用分析功能而不是分组或自加入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多