如何在Kusto查询语言中用partition by获取分组最小日期且保留全量数据?
KQL按分组保留最小DDay的所有行(避免关联原表)
问题
表tb1需按SupplierID分组,获取每个分组中DDay最小的所有行,保留全部列与符合条件的行,且不想通过聚合后关联原表实现。此前尝试的partition语句仅返回每个分组的一行,未达预期:
tb1 | partition hint.strategy = shuffle by SupplierID (top 1 by DDay asc)
原表示例(根据截图还原):
| SupplierID | DDay | 其他列 |
|---|---|---|
| 1 | 1 | ... |
| 1 | 1 | ... |
| 1 | 2 | ... |
| 2 | 2 | ... |
| 2 | 3 | ... |
期望输出:
| SupplierID | DDay | 其他列 |
|---|---|---|
| 1 | 1 | ... |
| 1 | 1 | ... |
| 2 | 2 | ... |
可行方案
方案1:Partition内计算最小值并过滤
在partition内部先算出当前分组的最小DDay,再筛选出等于该值的所有行:
tb1 | partition hint.strategy = shuffle by SupplierID ( let min_dday = min(DDay); where DDay == min_dday )
方案2:窗口函数(更简洁)
用rank()窗口函数按SupplierID分区,标记出DDay最小的行,再过滤保留:
tb1 | rank over (partition by SupplierID order by DDay asc) as rnk | where rnk == 1 | project-away rnk
- 若同一分组内有多个
DDay相同的最小值,rank()会给这些行都标记为1,全部保留; - 若只需保留其中一行,可替换为
row_number(),但会随机选取一行。
原语句问题说明
你之前的top 1 by DDay asc在每个分区内仅返回单条最小DDay记录,无法保留分组内所有相同最小值的行,因此不符合需求。
内容的提问来源于stack exchange,提问作者M J
相关产品推荐
相关产品推荐

