greatest-n-per-group - ClickHouse 中按组排列的前 N ​​行

标签 greatest-n-per-group clickhouse

在ClickHouse中按组查询前N行的正确方法是什么?
让我们以具有 id2、id4、v3 列且 N=2 的 tbl 为例。 我尝试了以下

SELECT                                                                          
    id2,                                                                        
    id4,                 
    v3 AS v3        
FROM tbl
GROUP BY                 
    id2,                 
    id4                  
ORDER BY v3 DESC                                                                
LIMIT 2 BY                       
    id2,                 
    id4      

但出现错误

Received exception from server (version 19.3.4):
Code: 215. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception
: Column v3 is not under aggregate function and not in GROUP BY..

我可以将 v3 放入 GROUP BY 中,它似乎确实有效,但按指标分组效率不高。

any 聚合函数,但我们实际上想要 all 值(由 LIMIT BY 子句限制为 2)而不是 any 值,所以这听起来不像是合适的解决方案。

SELECT                                                                          
    id2,                                                                        
    id4,                 
    any(v3) AS v3        
FROM tbl
GROUP BY                 
    id2,                 
    id4                  
ORDER BY v3 DESC                                                                
LIMIT 2 BY                       
    id2,                 
    id4      

最佳答案

可以使用aggregate functions像这样:

SELECT
    id2,
    id4,
    arrayJoin(arraySlice(arrayReverseSort(groupArray(v3)), 1, 2)) v3
FROM tbl
GROUP BY
    id2,
    id4

关于greatest-n-per-group - ClickHouse 中按组排列的前 N ​​行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54887869/

相关文章:

mysql - 获取选择多个表的最新行

mysql - MySQL中如何根据唯一ID的多个结果选择一条MAX记录

sql - Clickhouse 选择所有表上没有 max() 的最后一条记录

clickhouse - 使用join语句更新实例化 View

clickhouse - 如何在clickhouse中做分页

mysql - MySQL 在选择组中最好的时候的奇怪行为

sql - 如何在oracle中ID的每个重复行仅获取一条记录?

mysql - 为结果集中的每个id获取 `n`行MYSQL

java - Clickhouse JDBC 驱动类名