如何在多行匹配条件时为每个用户每日选取单行数据?
需求:为每个用户的每一天仅保留一行数据
示例输入
| name | eventDate | eventName |
|---|---|---|
| User1 | 2022-1-21 | car |
| User1 | 2022-1-21 | bus |
| User1 | 2022-1-23 | bus |
| User1 | 2022-1-23 | horse |
期望输出
| name | eventDate | eventName |
|---|---|---|
| User1 | 2022-1-21 | bus |
| User1 | 2022-1-23 | bus |
测试数据(Kusto 查询语言)
// 测试查询 // EVENTDATA:存储用户名、日期及事件名称,需为每个用户的唯一日期仅保留一行数据。 let EVENTDATA = datatable(name:string, eventDate:datetime, eventName: string) [ 'Jack', datetime(2022-01-12), 'Mets', 'Jack', datetime(2022-01-12), 'Dentist', 'Jack', datetime(2022-01-12), 'Movie', 'Jack', datetime(2022-01-13), 'Mets', 'Jack', datetime(2022-01-13), 'Movie', 'Jack', datetime(2022-01-14), 'Anything', 'Jack', datetime(2022-01-14), 'Else', 'Jack', datetime(2022-01-14), 'Movie', 'Jack', datetime(2022-01-15), 'Mets', 'Jack', datetime(2022-01-15), 'Dentist', 'Jack', datetime(2022-01-15), 'Movie', 'Jill', datetime(2022-01-18), 'Thing1', 'Jill', datetime(2022-01-18), 'Thing2', 'Jill', datetime(2022-01-18), 'Cats', 'Jill', datetime(2022-01-22), 'Play', 'Jill', datetime(2022-01-25), 'Darts', 'Jill', datetime(2022-01-30), 'Make', 'Jill', datetime(2022-01-30), 'Samples', 'Jill', datetime(2022-01-30), 'Shorter', 'Mary', datetime(2022-01-17), 'Cricket', 'Mary', datetime(2022-01-20), 'Football', 'Mary', datetime(2022-01-20), 'Rugby', 'Mary', datetime(2022-01-22), 'Curling' ];
解决方案
根据需求,可通过以下几种Kusto查询方式实现:
方法1:保留每个用户每日任意一行数据
使用take_any随机选取符合条件的一行:
EVENTDATA | summarize take_any(eventName) by name, eventDate
方法2:保留每个用户每日eventName排序后的最后一行(匹配示例逻辑)
使用arg_max按字符串顺序取最大的eventName对应的行:
EVENTDATA | summarize arg_max(eventName, *) by name, eventDate
方法3:保留每个用户每日eventName排序后的第一行
使用arg_min按字符串顺序取最小的eventName对应的行:
EVENTDATA | summarize arg_min(eventName, *) by name, eventDate
内容的提问来源于stack exchange,提问作者ezG
相关产品推荐
相关产品推荐

