使用分析函数将集合随机分组
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数据分析之Dataframe分组(group by)
Kotlin函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )
Kotlin函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )