【问题标题】: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?

任何帮助表示赞赏。

【问题讨论】:

    标签: sql oracle performance


    【解决方案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)?这是一次性的练习还是重复的任务?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多