SQL - Bigquery - 在集群分区上排名
SQL - Bigquery - Rank on clustered partitions
我在 Bigquery 上遇到了一个分析函数挑战,这让我很困惑。对不起,如果我在这里遗漏了任何基本功能,但我找不到它。
无论如何我认为这可以引起很好的讨论。
我想在组(dense_rank 或 row_number 或类似的东西)中获得排名,但在集群方式上,这是棘手的一点。
例如,我想创建的集群不仅基于两个分区列(见下图),而且还基于它们之间的顺序。这就是为什么我称它为集群。如果相邻,则每个集群应具有相同的等级,但如果不是(它被其他集群拆分),则应具有不同的编号。
因此,对于集群“a,x”,第一个集群的所有行的编号为 1,然后第二个集群的所有行的编号为 2,依此类推。
我怎样才能做到这一点?是否有开箱即用的分析功能,或者这是否需要一些辅助列?
提前致谢。
考虑以下方法
select partition_col_1, partition_col_2, order_col,
dense_rank() over(partition by partition_col_1, partition_col_2 order by group_number) output
from (
select *, countif(group_start) over(order by order_col) group_number
from (
select *,
ifnull((partition_col_1, partition_col_2) != lag((partition_col_1, partition_col_2)) over(order by order_col), true) group_start
from `project.dataset.table`
)
)
# order by order_col
如果应用于您问题中的示例数据 - 输出为
我在 Bigquery 上遇到了一个分析函数挑战,这让我很困惑。对不起,如果我在这里遗漏了任何基本功能,但我找不到它。
无论如何我认为这可以引起很好的讨论。
我想在组(dense_rank 或 row_number 或类似的东西)中获得排名,但在集群方式上,这是棘手的一点。
例如,我想创建的集群不仅基于两个分区列(见下图),而且还基于它们之间的顺序。这就是为什么我称它为集群。如果相邻,则每个集群应具有相同的等级,但如果不是(它被其他集群拆分),则应具有不同的编号。
因此,对于集群“a,x”,第一个集群的所有行的编号为 1,然后第二个集群的所有行的编号为 2,依此类推。
我怎样才能做到这一点?是否有开箱即用的分析功能,或者这是否需要一些辅助列?
提前致谢。
考虑以下方法
select partition_col_1, partition_col_2, order_col,
dense_rank() over(partition by partition_col_1, partition_col_2 order by group_number) output
from (
select *, countif(group_start) over(order by order_col) group_number
from (
select *,
ifnull((partition_col_1, partition_col_2) != lag((partition_col_1, partition_col_2)) over(order by order_col), true) group_start
from `project.dataset.table`
)
)
# order by order_col
如果应用于您问题中的示例数据 - 输出为