语法以计算UNIQUE匹配值的数量

时间:2018-09-11 17:54:00

标签: 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    |
    | 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         |

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

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

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

任何建议将不胜感激。我尝试使用“ COUNTIF”函数,但始终收到错误“无法识别的函数countif”,由于BigQuery文档(https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#countif中列出了“ COUNTIF”,这似乎很奇怪。还尝试使CASE正常工作,但没有取得太大进展。

谢谢!

1 个答案:

答案 0 :(得分:2)

以下是用于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