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

解析函数可以引用窗口中的多行吗?

施敏达
2023-03-14
问题内容

给定一个带有以下内容的表:

    ID  VALUE
    --  -----
    1   1
    2   2
    3   3
    4   4

我想计算像这样的东西:

    ID  VALUE  SUM
    --  -----  ---
    1   1       40     -- (2-1)*2 + (3-1)*3 + (4-1)*4 + (5-1)*5
    2   2       26     -- (3-2)*3 + (4-2)*4 + (5-2)*5
    3   3       14     -- (4-3)*4 + (5-3)*5
    4   4        5     -- (5-4)*5
    5   5        0     -- 0

其中,每行的SUM是每个后续行的值的总和乘以后续行与当前行的值之差。

我可以从这样的东西开始:

    CREATE TABLE x(id int, value int);

    INSERT INTO x VALUES(1, 1);
    INSERT INTO x VALUES(2, 2);
    INSERT INTO x VALUES(3, 3);
    INSERT INTO x VALUES(4, 4);
    INSERT INTO x VALUES(5, 5);

    SELECT id, value
          ,SUM(value) OVER(ORDER BY id ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) AS sum
      FROM x;

     id | value | sum
    ----+-------+-----
      1 |     1 |  14
      2 |     2 |  12
      3 |     3 |   9
      4 |     4 |   5
      5 |     5 |
    (5 rows)

其中每一行具有所有后续行的总和。但是要进一步讲,我真的很想要类似下面的伪代码:

    SELECT id, value
          ,SUM( (value - FIRST_ROW(value)) * value )
             OVER(ORDER BY id ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) AS sum
      FROM x;

但这是无效的。这就是问题的症结所在:是否有一种方法可以引用分析函数窗口中的多行?还是采用其他方式来解决这个问题?上面的示例是人为设计的。


问题答案:

不太确定我是否在这里完全理解了您的要求,但是您想要的查询类似于

select a.id, a.value, sum(( b.value - a.value ) * b.value )
from x a, x b
where a.id < b.id
group by a.id, a.value

希望能有所帮助。



 类似资料:
  • 我有一个数据流,有不同的字段,我想通过键来进行聚合计算(计数、平均、..) -字段1上键控的流 -字段2上键控的流

  • 问题内容: 我正在尝试创建一个SQL查询,该查询将拉取自Windows函数内的最后一个最大值起的最后5行以来的行数。在下面的示例中,它将为第8行返回2。最大值为12,即从第8行起的2行。 对于第6行,它将返回5,因为7的最大值位于5行之外。 我尝试了以下方法: 这使我达到最大值,但是我无法有效地确定它有多少行。我能够使用SELECT中的多个变量来接近,但这似乎没有效率或可伸缩性。 问题答案: 您可

  • 本文向大家介绍SQL中的开窗函数详解可代替聚合函数使用,包括了SQL中的开窗函数详解可代替聚合函数使用的使用技巧和注意事项,需要的朋友参考一下  在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难懂,给维护代码的人带来很大的痛苦,然而开窗函数出现了,

  • 我目前有一个大型数据集,但为了简单起见,它看起来如下所示: 我想在此数据集上使用一个窗口函数使其看起来如下所示: 过滤器背后的逻辑应该是,对于每个人,我们按照他们认识的时间长短对他们的朋友进行排序(较高的值位于顶部),然后只保留足够的朋友,以便他们的为100。 例如,Alice只需要Bob,因为她认识他的时间最长,而且他们的超过100。Bob需要Daniel和Alice,因为Bob认识Daniel

  • 我一直只使用Java6,现在正在赶上学习Java8的新内容。我在这里读了这篇文章:http://www.drdobbs.com/jvm/lambda-expressions-in-java-8/240166764?pgno=2 上面写着: Java API在Java中定义了几个通用功能接口。util。功能包。其中一个接口BiFunction描述了参数类型为T和U以及返回类型为R的函数。您可以将字符