使用分析函数将集合随机分组

Posted

技术标签:

【中文标题】使用分析函数将集合随机分组【英文标题】:Shuffle sets into groups using analytic functions 【发布时间】:2018-02-05 07:12:51 【问题描述】:

我正在尝试找到一种在单个查询中使用分析函数的方法。这是我的问题:

我的数据:基于相似性记录被预先组织成 SET(如下所示)。

我的目标:我正在尝试将集合随机分组,以便尽可能使来自同一 SET 的记录不在同一组中。

例如:

什么效果好:

下面是我的代码,它似乎完美地满足了我的要求。

/**** First update set wise row num ****/
insert into my_set_stage_1
select text,
       set,
       row_number() over(partition by set order by text) as set_sequence
from my_set;

/**** Next add to group using NTILE ****/
insert into my_set_stage_2
select text,
       set,
       set_sequence,
      ntile(10) over(order by set_sequence) as group_id
from my_set_stage_1 s;

我的问题:

我的实际数据量很大。如您所见,我使用 2 个中间表 = 2 个大查询。是否可以使用分析函数在单个查询中设置 group_id?

任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

为什么不直接执行那些没有插入的选择?

select s.text,
       s.set,
       s.set_sequence,
      ntile(10) over(order by s.set_sequence) as group_id
from (
    select text,
           set,
           row_number() over(partition by set order by text) as set_sequence
    from my_set
) s

"如果查询执行计划成本保持不变或减少。"

解释计划将向您显示执行 SELECT 语句的成本。它不会向您显示将大量数据插入(临时?)表的开销。我们预计总成本(返回结果集所用的时间)会减少。

显然,对大量数据进行排序并不是一项廉价的工作。在这一点上,通常的调整问题适用。多少数据是“大容量”?您可以使用哪些系统资源(内存、CPU)?这是一次性的练习还是重复的任务?

【讨论】:

以上是关于使用分析函数将集合随机分组的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析分组统计groupby

使用分析函数 Oracle 分组

python数据分析之Dataframe分组(group by)

Kotlin函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

Kotlin函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

分析函数和开窗函数