我必须遵循以下表格:
|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做到这一点?我无法在文档中找到做这些工作的任何事情。
答案 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