Ограничьте количество соединяемых строк в Kusto / KQL / ADX

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

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

let population=datatable (name: string, population: int64) [
  "New York", 4478934739,
  "Washington DC", 412165236,
  "Miami", 124437843,
  "Berlin", 222347384,
  "Munich", 6783434,
  "Hamburg", 6000033
];
let country=datatable (name: string, country: string) [
  "New York", "US",
  "Washington DC", "US",
  "Miami", "US",
  "Berlin", "DE",
  "Munich", "DE",
  "Hamburg", "DE"
];
population
| join kind=inner country on name

person roehrijn    schedule 10.02.2021    source источник


Ответы (1)


Это сработает?

Обратите внимание, что оператор раздел в настоящее время ограничен. до 64 значений (это временное ограничение)

let Populations=datatable (name: string, population: int64) [
  "New York", 4478934739,
  "Washington DC", 412165236,
  "Miami", 124437843,
  "Berlin", 222347384,
  "Munich", 6783434,
  "Hamburg", 6000033
];
let Countries=datatable (name: string, country: string) [
  "New York", "US",
  "Washington DC", "US",
  "Miami", "US",
  "Berlin", "DE",
  "Munich", "DE",
  "Hamburg", "DE"
];
Countries
| partition by country(
lookup Populations on name
| top 2 by population
)

Если вы не можете использовать раздел из-за ограничения количества разделов, вот альтернатива:

let Populations=datatable (name: string, population: int64) [
  "New York", 4478934739,
  "Washington DC", 412165236,
  "Miami", 124437843,
  "Berlin", 222347384,
  "Munich", 6783434,
  "Hamburg", 6000033
];
let Countries=datatable (name: string, country: string) [
  "New York", "US",
  "Washington DC", "US",
  "Miami", "US",
  "Berlin", "DE",
  "Munich", "DE",
  "Hamburg", "DE"
];
Countries
| lookup Populations on name
| order by country, population desc 
| extend rn = row_number(0, country != prev(country))
| where rn <=1
| project country, name, population
person Avnera    schedule 10.02.2021
comment
к сожалению нет. Потому что мне понадобится около 200k разделов. - person roehrijn; 10.02.2021
comment
Добавлено альтернативное решение - person Avnera; 10.02.2021
comment
Спасибо @Avnera. Блестяще. Альтернативное решение поможет. Я еще не реализовал его, но я почти на 100% уверен, что смогу решить проблему с помощью этого трюка. - person roehrijn; 11.02.2021