Синтаксис для подсчета количества УНИКАЛЬНЫХ совпадающих значений - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю с набором данных, который выглядит следующим образом:

    | 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" внизу, потому что есть только 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). Также пытался заставить CASE работать, но не смог добиться большого прогресса.

Спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

Ниже для BigQuery Standard 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    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...