ClickHouse中按组排列的前N行

ClickHouse中按组排列的前N行,clickhouse,Clickhouse,在ClickHouse中按组查询前N行的正确方法是什么? 让我们以具有id2、id4、v3列且N=2的tbl为例。 我尝试了以下方法 选择 id2, id4, v3作为v3 来自tbl 分组 id2, id4 按v3描述订购 限制2 id2, id4 但是得到了错误 Received exception from server (version 19.3.4): Code: 215. DB::Exception: Received from localhost:9000, 127.0.0.1.

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

选择 id2, id4, v3作为v3 来自tbl 分组 id2, id4 按v3描述订购 限制2 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按分组方式进行分组,它似乎确实起作用,但按指标进行分组是没有效率的

这里有任何聚合函数,但实际上我们希望所有值都被LIMIT by子句限制为2,而不是任何值,所以这听起来不像是合适的解决方案

选择 id2, id4, anyv3作为v3 来自tbl 分组 id2, id4 按v3描述订购 限制2 id2, id4 它可以这样使用:

column    | group by    
++++++++++++++++++++++
A         | Yes
B         | Yes
C         | No
选择 id2, id4, 阵列JoinArrayLicenseArrayVerseSortGroupArrayV3,1,2 v3 来自tbl 分组 id2, id4
您还可以按照本文中所述的在普通SQL中执行此操作的方式来执行此操作

虽然弗拉基米尔的解决方案适用于许多情况,但对我的情况并不适用。我有一张桌子,看起来像这样:

column    | group by    
++++++++++++++++++++++
A         | Yes
B         | Yes
C         | No
现在,假设A列标识用户,B列代表用户可以执行的任何操作。G在您的网站或在线游戏上。列C是用户执行此特定操作的频率总和。Vladimir的解决方案将允许我获得A列和C列,但不是用户在B列所做的操作,这意味着我将知道用户做某事的频率,但不知道做了什么

这样做的原因是,同时按A和B分组是没有意义的。每一行都是一个唯一的组,您无法找到前K行,因为每个组只有一个成员。结果与您查询的表相同。相反,如果只按A分组,则可以应用vladimir的解决方案,但只能得到A列和C列。不能输出B列,因为它不是所解释的group by语句的一部分

如果您希望获得用户完成的前2项、前5项或前100项操作,您可以寻找一个解决方案,该解决方案包括:

SELECT rs.id2, rs.id4, rs.v3
    FROM (
        SELECT id2, id4, v3, row_number()
        OVER (PARTITION BY id2, id4 ORDER BY v3 DESC) AS Rank
        FROM tbl
    ) rs WHERE Rank <= 2

注意:要使用此选项,您必须设置。

感谢您的解决方案,但它不会以预期的格式返回结果,多行被折叠到数组中,这不是预期的格式。我不想在输出上有嵌套的数据结构;这就行了。有人知道这个解决方案的性能吗?有人知道性能吗?它与另一个相比如何?有趣的问题。还没有达到基准。在接下来的几个月里,我将与ClickHouse合作,并根据我们的需要对其进行测试,如果没有其他人同时这样做,也许我会将这些方法相互比较,并让您知道。