Top-N
您可以根据条件在 Timeplus 流或视图中获得最顶部或最底部的事件。
有 3 种类型的 Top-N 查询模式:
- Top-K:获取字段的最常用值。 例如,每个具有
action
字段的事件都可以添加/移除/服务。 您想要检查哪些操作在实时数据中最常见。 为了避免与一般 Top-N 模式混淆,我们称这种模式为 Top-K。 - Max-K:获取字段的最高值。 例如,每个事件都有一个
speed_kmh
字段。 您想要的是速度最快的车。 在某些系统中,这被称为 TopN。 但是我们认为 Max-N 或 Max-K 会更准确。 - Min-K:获取字段的最底部值。 例如,每个事件都有一个
speed_kmh
字段。 您想要的是速度最慢的车。
请继续阅读以获取更详细的解释和示例。
Top-K
示例查询:
select top_k(action,3) from bookings where _tp_time > now()-1d
结果:
top_k(action,3) |
---|
[ [ "add", 86342 ], [ "service", 82013 ], [ "cancel", 4291 ] ] |
[ [ "add", 86342 ], [ "service", 82013 ], [ "cancel", 4291 ] ] |
此查询列出 1d
(一天)以来 预订
流中最常见的 操作
。 它还显示该值的出现次数。 例如,“ 添加” 操作显示 86342 次,“服务” 操作显示 82013 次,依此类推。
如果您不需要出现次数,您可以传递 false 作为 top_k 函数的第三个参数,例如:
示例查询:
select top_k(action,3,false) from bookings where _tp_time > now()-1d
结果:
top_k(action,3) |
---|
[ "add", "service", "cancel" ] |
[ "add", "service", "cancel" ] |
请注意,这个示例查询是一个 全局聚合,它每两秒计算并发出结果。 您也可以使用不同的时间窗口来运行聚合,例如:
select window_start, top_k(action,3)
from tumble(bookings,1h)
where _tp_time > now()-1d
group by window_start
Max-K
在某些系统中,这被称为 TopN。 但是我们认为 Max-N 或 Max-K 会更准确。
示例查询:
select max_k(speed_kmh,10) from car_live_data
结果:
max_k(speed_kmh,10) |
---|
[ 55, 54, 54, 53, 53, 53, 53, 53, 53, 53 ] |
[ 55, 55, 55, 55, 54, 54, 54, 54, 54, 54 ] |
在许多情况下,您需要知道具有这种最大值的其他列的值。 您可以在 max_k 函数中添加任意数量的列名作为可选参数。
select max_k(speed_kmh,3,cid,_tp_time) from car_live_data
结果:
max_k(speed_kmh,3,cid,_tp_time) |
---|
[ [ 56, "c00002", "2023-07-16T17:25:55.65Z" ], [ 54, "c00128", "2023-07-16T17:25:55.336Z" ], [ 54, "c00075", "2023-07-16T17:25:55.65Z" ] ] |
[ [ 56, "c00002", "2023-07-16T17:25:55.65Z" ], [ 55, "c00043", "2023-07-16T17:25:58.433Z" ], [ 54, "c00075", "2023-07-16T17:25:55.65Z" ] ] |
Min-K
与 Max-K 相反。 使用可选的上下文列获取最底端的值。
示例查询:
select min_k(speed_kmh,10) from car_live_data
或者:
select min_k(speed_kmh,3,cid,_tp_time) from car_live_data
Top-N By Group
无论是 top_k、max_k 还是 min_k,您也可以将它们与 partition by
组合起来,以获得指定组中的 top-N 值。
假设每辆车的数据具有 model
属性。
这个查询可以得到每款车型中最快的 3 辆车
select max_k(speed_kmh,3,cid,_tp_time,model) over(partition by model) from car_live_data