Sql 用于计算唯一匹配值数的语法

Sql 用于计算唯一匹配值数的语法,sql,google-bigquery,Sql,Google Bigquery,我使用的数据集如下所示: | 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 |

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

    | 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         |
我试图找出一个查询,它将生成一个如下所示的摘要:

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

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

任何建议都将不胜感激。我尝试了一个“COUNTIF”函数,但不断出现错误“Unrecognized function COUNTIF”,这似乎很奇怪,因为“COUNTIF”列在BigQuery文档()中。他也试图让这个案子成功,但没有取得多大进展


谢谢

下面是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子句,认为这是问题的一部分。你说得对,这个查询非常有效!谢谢你的帮助,非常感谢。没问题。很高兴你拿到了。考虑接受这个答案吧!o)