Oracle - 通过“步骤”分组

时间:2017-05-23 14:00:00

标签: sql oracle

我必须遵循以下表格:

|MY_VALUES|
|---------|
| 1       | 1' iteration
| 3       | 1' iteration   | 2' iteration
| 2       | 1' iteration   | 2' iteration   | 3' iteration
| 5       | 1' iteration   | 2' iteration   | 3' iteration
| 3       | 1' iteration   | 2' iteration   | 3' iteration
| 2       |                | 2' iteration   | 3' iteration
| 4       |                                 | 3' iteration

我需要一个输出如下的查询:

MY_RESULTS
----------
14
15
16

查询基本上是对第一个结果的前5行求和,然后是一个值前进,它将另外5个相加,依此类推......

有没有办法用Oracle做到这一点?我无法在文档中找到做这些工作的任何事情。

3 个答案:

答案 0 :(得分:3)

SQL表代表无序集。除非您有一个指定排序的列。

,否则不存在5个相邻行

然后,您可以使用窗口函数执行此操作,假设您有这样的列:

select t.*, sum(my_values) over (order by id rows between 4 preceding and current row) as sum5
from t;

这适用于所有行。如果你想删除前4个(而且#34; id"不能那么容易),有多种方法:

select t.*
from (select t.*,
             sum(my_values) over (order by id rows between 4 preceding and current row) as sum5,
             row_number() over (order by id) as seqnum
      from t
     ) t
where seqnum >= 5;

答案 1 :(得分:1)

你的桌子有点薄,只有一列,所以你没有真正有需要的东西,但是这样的东西: -

"Device Stopped"

答案 2 :(得分:0)

假设您的表已经有一个行号,您可以通过迭代表和每行使用相关子查询来获得所需的结果,该子查询将当前行的值与前面的4行相加。

由于您还没有行号,我们需要包含它。但是,您甚至没有可用于重现您向我们展示的数据顺序的列。在下面的查询中,我假设您的表有一列id,可用于生成订单。如果您没有这样的列,我建议您添加它。

WITH cte AS (
    SELECT MY_VALUES,
           ROW_NUMBER() OVER (ORDER BY id) rn
    FROM yourTable
)
SELECT
    (SELECT SUM(t2.MY_VALUES) FROM cte t2
     WHERE t2.rn BETWEEN t1.rn AND t1.rn + 4) AS MY_RESULTS
FROM cte t1
WHERE t1.rn <= (SELECT COUNT(*) FROM yourTable) - 4