当前位置: 首页 > 面试题库 >

考虑行之间的“差异”对行进行分组

戴品
2023-03-14
问题内容

我有一个表,其中包含开始时间(在示例中使用数字以使其保持简单)以及事件的持续时间。

我想确定“块”及其开始时间和结束时间。
每当前一行的结束时间(开始时间+持续时间)(按开始时间排序)与当前行的开始时间之间的差值为时,>=5应开始一个新的“块”。

这是我的测试数据,包括在注释中尝试进行图形解释的尝试:

WITH test_data AS (
  SELECT  0 s, 2 dur FROM dual UNION ALL   --# 鈻犫枲
  SELECT  2  , 2     FROM dual UNION ALL   --#   鈻犫枲
  SELECT 10  , 1     FROM dual UNION ALL   --#           鈻�
  SELECT 13  , 4     FROM dual UNION ALL   --#              鈻犫枲鈻犫枲
  SELECT 15  , 4     FROM dual             --#                鈻犫枲鈻犫枲
)
--# Should return
--#   0 ..  4                              --# 鈻犫枲鈻犫枲
--#  10 .. 19                              --#           鈻犫枲鈻犫枲鈻犫枲鈻犫枲鈻�

第一个块开始于0,结束于4。由于与下一行的区别是>=5,开始另一个块10,终止于19

我可以使用来识别块的第一行LAG,但是我还没有找到如何继续的方法。

我可以在PL / SQL循环中解决问题,但是出于性能原因,我试图避免这种情况。

关于如何编写此查询的任何建议?

预先感谢,彼得


问题答案:

我将子查询与分析结合使用,以识别和分组连续范围:

SQL> WITH test_data AS (
  2    SELECT  0 s, 2 dur FROM dual UNION ALL   --# 鈻犫枲
  3    SELECT  2  , 2     FROM dual UNION ALL   --#   鈻犫枲
  4    SELECT 10  , 1     FROM dual UNION ALL   --#           鈻�
  5    SELECT 13  , 4     FROM dual UNION ALL   --#              鈻犫枲鈻犫枲
  6    SELECT 15  , 4     FROM dual             --#                鈻犫枲鈻犫枲
  7  )
  8  SELECT MIN(s) "begin", MAX(s + dur) "end"
  9    FROM (SELECT s, dur, SUM(gap) over(ORDER BY s) my_group
 10             FROM (SELECT s, dur,
 11                           CASE
 12                              WHEN lag(s + dur) over(ORDER BY s) >= s - 5 THEN
 13                               0
 14                              ELSE
 15                               1
 16                           END gap
 17                      FROM test_data
 18                     ORDER BY s))
 19   GROUP BY my_group;

     begin        end
---------- ----------
         0          4
        10         19


 类似资料:
  • 我有一个遗传数据集,我想对基因组中物理上接近的遗传变异/行进行分组。我想对每个染色体()基因组中某些斑点范围内的基因进行分组。 我的“spots”数据集包含变量/行需要在一定范围内的位置,如下所示: 我的< code>low和< code>high列是我希望查看下一个数据集中是否有任何行落入其中的范围,同时考虑到染色体(< code>chrom)也必须匹配。具有唯一范围和chrom组合的每一行都是

  • 有一个矩阵a,比如: 我只想得到每行没有3个或更多数字的行,它们之间都有最大差异 此函数应仅返回第1行。

  • 编辑:从我的角度来看,这太含蓄了,但这个想法当然是一个可能的解决方案,它将是最快的(比调用两次流生成器更快,并且至少要分别执行两个操作): ...利用一次迭代,而不必在内存上加载整个集合。我在做答案并行化的测试

  • 我的数据集示例如下: 我对这个数据集有两个问题: < li >我需要计算日期之间的差异,但此差异将基于“买方”和“id”分组来计算,这意味着,买方“Jenny”和Id“9”的日期差异将是一个组,Id为“4”的买方“Chang”将是另一个组,Id为“5”的买方“Chunfei”将是另一个组,Id为“8”的“Chunfei”将是另一个组。因此,输出将是: 问题是我不明白为什么group_by不起作用。

  • 在任何情况下(反之亦然),是否有任何理由选择并行的。对于每个而不是等待ForEachAsync?或者它们实际上是相同的? VS公司

  • 本文向大家介绍成本差异和进度差异之间的差异,包括了成本差异和进度差异之间的差异的使用技巧和注意事项,需要的朋友参考一下 对于任何应用程序或专门用于任何项目,最关注的因素之一是在开发前和开发后阶段的预算管理和时间管理。因此,要评估任何项目的这两个主要因素,有很多方法,其中成本差异和进度差异是两个重要且主要的方法。 顾名思义,“成本差异”基于项目开发中花费的成本,而“进度差异”则基于相同开发中花费的时