Руководство. Использование функций агрегирования

Переключайте службы с помощью раскрывающегося списка Версия. Дополнительные сведения о навигации.
Область применения: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

Функции агрегирования группируют и объединяют данные из нескольких строк в сводное значение. Сводное значение зависит от выбранной функции, например количества, максимального или среднего значения.

В этом руководстве вы узнаете, как:

В этом руководстве в примерах используется таблица StormEvents, которая общедоступна в help кластере. Чтобы изучить собственные данные, создайте собственный бесплатный кластер.

Примеры, приведенные в этом руководстве, используют таблицуStormEvents, которая общедоступна в примерах данных аналитики погоды.

В этом руководстве показано, как создать основу из первого руководства, изучить общие операторы.

Предварительные требования

Для выполнения следующих запросов требуется среда запроса с доступом к примеру данных. Используйте один из следующих вариантов:

  • Учетная запись Майкрософт или учетная запись пользователя Microsoft Entra для входа в кластер справки

Использование оператора Summarize

Оператор суммирования необходим для выполнения агрегирования по данным. Оператор summarize группирует строки на основе by предложения, а затем использует предоставленную функцию агрегирования для объединения каждой группы в одну строку.

Найдите количество событий по штатам с помощью summarize и агрегационной функции count.

StormEvents
| summarize TotalStorms = count() by State

Выходные данные

Штат TotalStorms
TEXAS 4701
КАНЗАС 3166
АЙОВА 2337
ИЛЛИНОЙС 2022
МИССУРИ 2016
... ...

Визуализация результатов запроса

Визуализация результатов запроса в диаграмме или графе поможет определить шаблоны, тенденции и выбросы данных. Эти визуализации можно создать с помощью оператора отрисовки .

На протяжении всего руководства вы увидите примеры использования render для отображения результатов. Некоторые доступные типы диаграмм включают линейчатые диаграммы, графики, круговые диаграммы и точечные диаграммы. Теперь используйте render для просмотра результатов предыдущего запроса на линейчатой диаграмме.

StormEvents
| summarize TotalStorms = count() by State
| render barchart

Снимок экрана столбчатой диаграммы общих штормов по штатам, созданной с помощью оператора отрисовки.

Условное подсчет строк

При анализе данных используйте countif() для подсчета строк на основе определенного условия. Эта функция помогает понять, сколько строк соответствует заданным критериям.

Следующий запрос используется countif() для подсчета штормов, которые вызвали ущерб. Затем запрос использует оператор top, чтобы отфильтровать результаты и отобразить штаты с наибольшим ущербом урожаю, вызванным штормами.

StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage

Выходные данные

Штат Штормы, повредившие урожай
АЙОВА 359
НЕБРАСКА 201
МИССИСИПИ 105
СЕВЕРНАЯ КАРОЛИНА 82
МИССУРИ 78

Группирование данных в ячейки

Чтобы агрегировать данные по числовым или временным значениям, сначала сгруппировать данные в ячейки с помощью функции bin(). Использование bin() помогает понять, как значения распределяются в определенном диапазоне и упрощают сравнение различных периодов.

Следующий запрос подсчитывает количество штормов, которые нанесли ущерб сельскохозяйственным культурам для каждой недели 2007 года. Аргумент 7d представляет неделю, так как функция требует допустимого значения интервала времени.

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)

Выходные данные

Время начала Количество событий
2007-01-01T00:00:00Z 16
2007-01-08T00:00:00Z 20
2007-01-29T00:00:00Z 8
2007-02-05T00:00:00Z 1
2007-02-12T00:00:00Z 3
... ...

Добавьте | render timechart в конец запроса, чтобы визуализировать результаты.

Снимок экрана диаграммы ущерба урожая за неделю, созданной предыдущим запросом.

Примечание.

bin() похожа на функцию floor() на других языках программирования. Он округляет каждое значение до ближайшего значения, кратного заданному вами модулю, и позволяет summarize распределять строки по группам.

Вычисление минимальной, максимальной, avg и суммы

Чтобы узнать больше о типах штормов, которые наносят ущерб урожаю, вычислите значения min(), max() и avg() ущерба урожаю для каждого типа события. Затем сортируйте результат по среднему повреждению.

Для создания нескольких вычисляемых столбцов можно использовать несколько агрегатных функций в одном summarize операторе.

StormEvents
| where DamageCrops > 0
| summarize
    MaxCropDamage=max(DamageCrops), 
    MinCropDamage=min(DamageCrops), 
    AvgCropDamage=avg(DamageCrops)
    by EventType
| sort by AvgCropDamage

Выходные данные

Тип события MaxCropDamage MinCropDamage Средний урон посевам
Мороз/заморозки 568600000 3000 9106087.5954198465
Лесной пожар 21000000 10000 7268333.333333333
Засуха 700000000 2000 6763977.8761061952
Наводнение 500000000 1000 4844925.23364486
Ураганный ветер 22000000 100 920328.36538461538
... ... ... ...

Результаты предыдущего запроса указывают на то, что заморозки и морозы в среднем наносят наибольший ущерб сельскохозяйственным культурам. Однако запрос bin() показывает, что события, связанные с ущербом сельскохозяйственным культурам, в основном происходят в летние месяцы.

Используйте sum() для проверки общего количества поврежденных культур вместо количества событий, вызвавших некоторые повреждения, как показано в count() предыдущем запросе bin().

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize CropDamage = sum(DamageCrops) by bin(StartTime, 7d)
| render timechart

Снимок экрана диаграммы времени, показывающей повреждения урожая по неделям.

Теперь можно увидеть пик ущерба урожаю в январе, который, вероятно, был вызван морозом/заморозками.

Совет

Используйте minif(), maxif(), avgif()и sumif() для выполнения условных агрегирования, как и в разделе условного подсчета строк .

Вычисление процентных значений

Вычисление процентных значений позволяет понять распределение и пропорцию различных значений в данных. В этом разделе рассматриваются два распространенных метода вычисления процентных значений с помощью языка запросов Kusto (KQL).

Вычисление процента на основе двух столбцов

Используйте count() и countif, чтобы определить процентную долю штормовых явлений, которые нанесли ущерб сельскохозяйственным культурам в каждом штате. Сначала подсчитайте общее количество штормов в каждом штате. Затем подсчитайте количество штормов, которые нанесли ущерб сельскохозяйственным культурам в каждом штате.

Затем используйте extend, чтобы вычислить процентное соотношение между двумя столбцами, разделив количество штормов, нанесших ущерб урожаю, на общее количество штормов и умножив результат на 100.

Чтобы получить десятичный результат, используйте функцию todouble() для преобразования по крайней мере одного из целочисленных значений в двойной перед выполнением деления.

StormEvents
| summarize 
    TotalStormsInState = count(),
    StormsWithCropDamage = countif(DamageCrops > 0)
    by State
| extend PercentWithCropDamage = 
    round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage

Выходные данные

Штат TotalStormsInState Штормы, повредившие урожай Процент с повреждением посевов
АЙОВА 2337 359 15.36
НЕБРАСКА 1766 201 11,38
МИССИСИПИ 1218 105 8.62
СЕВЕРНАЯ КАРОЛИНА 1721 82 4,76
МИССУРИ 2016 78 3.87
... ... ... ...

Примечание.

При вычислении процентов преобразуйте по крайней мере одно из целочисленных значений, участвующих в делении, с помощью todouble() или toreal(). Это преобразование гарантирует, что вы не получаете усеченные результаты из-за целочисленного деления. Дополнительные сведения см. в разделе "Правила типа" для арифметических операций.

Вычисление процента на основе размера таблицы

Чтобы сравнить количество штормов по типу события с общим числом штормов в базе данных, сначала сохраните общее количество штормов в базе данных в качестве переменной. Используйте инструкции Let для определения переменных в запросе.

Так как операторы табличных выражений возвращают табличные результаты, используйте функцию toscalar() для преобразования табличного результата count() функции в скалярное значение. Затем используйте числовое значение в расчете процента.

let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0

Выходные данные

Тип события Количество событий Процентное отношение
Ураганный ветер 13015 22.034673077574237
Град 12711 21.519994582331627
Паводок 3688 6.2438627975485055
Засуха 3616 6.1219652592015716
Холод 3349 5.669928554498358
... ... ...

Извлечь уникальные значения

Используйте make_set(), чтобы превратить выбор строк в таблицу в массив уникальных значений.

Следующий запрос используется make_set() для создания массива типов событий, вызывающих смерть в каждом состоянии. Результирующая таблица затем сортируется по количеству типов штормов в каждом массиве.

StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)

Выходные данные

Штат ТипыШтормовСоСмертельнымиСлучаями
CALIFORNIA ["Грозовой ветер","Высокий прибой","Холод / ветровой холод","Сильный ветер","Разрывное течение","Жара","Чрезмерная жара","Лесной пожар","Пыльный шторм","Астрономически низкий прилив","Плотный туман","Зимняя погода"]
TEXAS ["Внезапное наводнение", "Грозовой ветер", "Торнадо", "Молния", "Наводнение", "Ледяной дождь", "Зимняя погода", "Отбойное течение", "Экстремальная жара", "Плотный туман", "Ураган (Тайфун)", "Холод / ветровой холод"]
ОКЛАХОМА ["Внезапное наводнение","Торнадо","Сильный холод/ветровой холод","Зимний шторм","Сильный снегопад","Чрезмерная жара","Жара","Ледяной шторм","Зимняя погода","Густой туман"]
НЬЮ-ЙОРК ["Наводнение", "Молния", "Грозовой ветер", "Внезапное наводнение", "Зимняя погода", "Ледяной дождь", "Экстремальный холод/пронизывающий ветер", "Зимний шторм", "Сильный снегопад"]
КАНЗАС ["Грозовой ветер", "Сильный дождь", "Торнадо", "Наводнение", "Внезапное наводнение", "Молния", "Сильный снегопад", "Зимняя погода", "Метель"]
... ...

Группировать данные по условию

Функция case() группирует данные в контейнеры на основе указанных условий. Функция возвращает соответствующее выражение результата для первого удовлетворенного предиката или окончательное выражение else, если ни один из предикат не удовлетворен.

В этом примере группируются государства на основе числа травм, связанных с штормом, которые их граждане получили.

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| sort by State asc

Выходные данные

Штат Количество травм ТравмыBucket
АЛАБАМА 494 Большой
АЛЯСКА 0 Нет травм
АМЕРИКАНСКОЕ САМОА 0 Нет травм
АРИЗОНА 6 Небольшой
АРКАНЗАС 54 Большой
АТЛАНТИЧЕСКИЙ СЕВЕР 15 Средняя
... ... ...

Создайте круговую диаграмму, чтобы визуализировать долю штатов, в которых произошли штормы, приведшие к большому, среднему или небольшому числу травм.

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| summarize InjuryBucketByState=count() by InjuriesBucket
| render piechart 

Снимок экрана: круговая диаграмма пользовательского интерфейса, отображаемая предыдущим запросом.

Выполнить агрегации в скользящем окне

В следующем примере показано, как суммировать столбцы с помощью скользящего окна.

Запрос вычисляет минимальный, максимальный и средний материальный ущерб от торнадо, наводнений и лесных пожаров с помощью скользящего окна длиной в семь дней. Каждая запись в результирующем наборе агрегирует данные за предыдущие семь дней, а результаты содержат запись за день в период анализа.

Ниже приведены пошаговые объяснения запроса:

  1. Сгруппируйте каждую запись по одному дню относительно windowStart.
  2. Добавьте семь дней в значение ячейки, чтобы задать конец диапазона для каждой записи. Если значение выходит за пределы диапазона windowStart и windowEndизмените значение соответствующим образом.
  3. Создайте массив из семи дней для каждой записи, начиная с текущего дня записи.
  4. Разверните массив из шага 3 с помощью mv-expand , чтобы дублировать каждую запись до семи записей с интервалами в один день между ними.
  5. Выполните агрегацию для каждого дня. Из-за шага 4 этот шаг фактически суммирует предыдущие семь дней.
  6. Исключите первые семь дней из окончательного результата, потому что для них нет семидневного периода обратного просмотра.
let windowStart = datetime(2007-07-01);
let windowEnd = windowStart + 13d;
StormEvents
| where EventType in ("Tornado", "Flood", "Wildfire") 
| extend bin = bin_at(startofday(StartTime), 1d, windowStart) // 1
| extend endRange = iff(bin + 7d > windowEnd, windowEnd, 
                      iff(bin + 7d - 1d < windowStart, windowStart, 
                        iff(bin + 7d - 1d < bin, bin, bin + 7d - 1d))) // 2
| extend range = range(bin, endRange, 1d) // 3
| mv-expand range to typeof(datetime) // 4
| summarize min(DamageProperty), max(DamageProperty), round(avg(DamageProperty)) by Timestamp=bin_at(range, 1d, windowStart), EventType // 5
| where Timestamp >= windowStart + 7d; // 6

Выходные данные

Следующая таблица результатов усечена. Чтобы просмотреть полные выходные данные, выполните запрос.

Метка времени Тип события min_DamageProperty max_DamageProperty avg_DamageProperty
2007-07-08T00:00:00Z Торнадо 0 30 000 6905
2007-07-08T00:00:00Z Наводнение 0 200000 9261
2007-07-08T00:00:00Z Лесной пожар 0 200000 14033
2007-07-09T00:00:00Z Торнадо 0 100000 14783
2007-07-09T00:00:00Z Наводнение 0 200000 12529
2007-07-09T00:00:00Z Лесной пожар 0 200000 14033
2007-07-10T00:00:00Z Торнадо 0 100000 31400
2007-07-10T00:00:00Z Наводнение 0 200000 12263
2007-07-10T00:00:00Z Лесной пожар 0 200000 11694
... ... ...

Следующий шаг

Теперь, когда вы знакомы с общими операторами запросов и функциями агрегирования, перейдите к следующему руководству, чтобы узнать, как присоединить данные из нескольких таблиц.