【问题标题】:Syntax to count the number of UNIQUE matching values计算 UNIQUE 匹配值数量的语法
【发布时间】:2018-09-12 01:59:57
【问题描述】:

我正在使用如下所示的数据集:

    | Host      | Risk           | Name      |
    | 10.1.1.1  | Critical       | ValueA    |
    | 10.1.1.1  | Critical       | ValueA    |
    | 10.1.1.1  | Critical       | ValueA    |
    | 10.1.1.1  | Critical       | ValueA    |
    | 10.1.1.1  | Critical       | ValueA    |
    | 10.1.1.1  | Critical       | ValueA    |
    | 10.1.1.1  | High           | ValueB    |
    | 10.1.1.1  | High           | ValueB    |
    | 10.1.1.1  | High           | ValueB    |
    | 10.1.1.1  | Critical       | ValueC    |
    | 10.1.1.1  | Critical       | ValueC    |
    | 10.1.1.1  | Critical       | ValueC    |
    | 10.1.1.1  | Critical       | ValueC    |

我正在尝试找出一个查询,该查询将生成如下所示的摘要:

    | Host      | Critical     | High      |
    | 10.1.1.1  | 2            | 1         |

Critical 下面有一个“2”,因为 Name 字段只有 2 个 DISTINCT 值(“ValueA”和“ValueC”)。 High 下面有一个“1”,因为只有 1 个不同的 Name 值(“ValueB”)。对我来说棘手的部分是我不想计算行数,而只是计算匹配的不同值。如果您想知道,数据是重复的,因为还有其他列包含唯一值,但它们与此查询无关。

我自己能够得到的最接近如下,但这只产生了“关键”列,我不知道如何添加逻辑来获得“高”列:

    select Host, COUNT(DISTINCT Name) as Critical
    from [table]
    WHERE Risk = 'Critical'
    group by 1;

任何建议将不胜感激。我尝试了一个“COUNTIF”函数,但不断收到错误“Unrecognized function countif”,这似乎很奇怪,因为 BigQuery 文档 (https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#countif) 中列出了“COUNTIF”。也试图使 CASE 工作,但没有取得很大进展。

谢谢!

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT '10.1.1.1' Host, 'Critical' Risk, 'ValueA' Name UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueA' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueA' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueA' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueA' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueA' UNION ALL
      SELECT '10.1.1.1', 'High', 'ValueB' UNION ALL
      SELECT '10.1.1.1', 'High', 'ValueB' UNION ALL
      SELECT '10.1.1.1', 'High', 'ValueB' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueC' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueC' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueC' UNION ALL
      SELECT '10.1.1.1', 'Critical', 'ValueC' 
    )
    SELECT 
      Host, 
      COUNT(DISTINCT IF(Risk='Critical', Name, NULL)) Critical,
      COUNT(DISTINCT IF(Risk='High', Name, NULL)) High
    FROM `project.dataset.table`
    GROUP BY Host   
    

    结果

    Row Host        Critical    High     
    1   10.1.1.1    2           1    
    

    【讨论】:

    • 嗨,米哈伊尔,感谢您的回复!抱歉,我应该提到另一件事——“名称”列中有数百个值,因此手动将它们全部输入实际上是不可行的。有什么建议可以解决这个问题吗?
    • 此解决方案不需要键入 Name 列的任何值
    • 是的,在这个解决方案中不需要输入Name列的具体值。再次检查并询问是否仍然混乱:o)
    • 对不起!误解了 WITH 子句,认为这是查询的一部分。你是对的,查询完美!感谢您的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多