APPROX_TOP_K¶
使用 Space-Saving 返回输入中出现频率最高的值的近似值,以及其近似频率。
输出是一个由数组组成的 JSON 数组。在内部数组中,第一个条目是输入中的一个值,第二个条目对应于其在输入中的估计频率。外部数组包含 k
项目(按频率降序排序)。
有关 APPROX_TOP_K 的更多信息,请参阅 估计频次值。
语法¶
聚合函数
APPROX_TOP_K( <expr> [ , <k> [ , <counters> ] ] )
窗口函数
APPROX_TOP_K( <expr> [ , <k> [ , <counters> ] ] ) OVER ( [ PARTITION BY <expr4> ] )
实参¶
expr
:要查找最常见值的表达式(例如,列名称)。k
:要近似其计数的值数。例如,如果您想查看前 10 个最常见的值,则将k
设置为 10。如果省略
k
,默认值为1
。最大值为
100000
(100,000),如果输出中无法容纳项目,该值将自动减小。counters
:这是在估算过程中一次可以跟踪的非重复值数量上限。例如,如果counters
设置为 100000,则算法将跟踪 100000 个不同值,尝试保留 100000 个比较频繁的值。counters
的数量上限是100000
(100000)。
expr4
这是可选表达式,用于将行分组到分区。
使用说明¶
如果
counters
的数量较多,近似值会更准确,因此在大多数情况下,counters
数量应该比k
大得多。(每个计数器只占用少量内存,因此增加计数器的数量不会占用大量内存)。
用作窗口函数时:
此函数不支持:
OVER() 子句中的 ORDER BY 分子句。
窗口框架。
示例¶
SELECT APPROX_TOP_K(C4) FROM lineitem;
--------------------+
APPROX_TOP_K(C4,3) |
--------------------|
[ |
[ |
1, |
124923 |
], |
[ |
2, |
107093 |
], |
[ |
3, |
89315 |
] |
] |
--------------------+
WITH states AS (
SELECT approx_top_k(C4, 3, 5) AS state
FROM lineitem
)
SELECT value[0]::INT AS value, value[1]::INT AS frequency
FROM states, LATERAL FLATTEN(state);
-------+-----------+
VALUE | FREQUENCY |
-------+-----------|
1 | 124923 |
2 | 107093 |
3 | 89438 |
-------+-----------+