如何连续添加起始行和下一行的值

Posted

技术标签:

【中文标题】如何连续添加起始行和下一行的值【英文标题】:How to continously add values of starting row and next row to it 【发布时间】:2015-08-27 03:46:46 【问题描述】:

我只想创建一个 sql 查询,结果类似于图像。类似于 SQL 中的斐波那契数列。

例如

Column 1: 10 ,则 Result 列的值为 Result: 10 ,因为那是第一行。 ,那么假设column1第2行的值为50,那么Result第2行的值为60..(Result: 60)..以此类推。

示例如下图。

我怎样才能连续做到这一点?任何帮助,将不胜感激。谢谢

【问题讨论】:

***.com/questions/21746100/… @willoller 对此表示感谢,但实际上我正在研究如何在两列“column1 和结果”之间添加值,就像上图一样,不像创建斐波那契数列那么简单。类似于斐波那契的东西,但数字相加是在两列之间。 您要的是累计吗? 搜索“SQL 递归 CTE* 或 递归 SQL 公用表表达式 @Blorgbeard ,是的,就像总跑一样。你有任何 sql 查询吗?这样我就可以研究代码并在我这边应用逻辑。谢谢 【参考方案1】:

如果您使用MSSQL2012 或更高版本,则可以使用OVER 子句。

SELECT t2.id, t2.value, SUM(t2.value) OVER (ORDER BY t2.id) as [Result]
FROM   Test01 t2
ORDER BY t2.id;

sql fiddle demo

【讨论】:

非常感谢 Sabyasachi,它有效! :) ,自从我使用 2012 版本以来,我就使用了这个。这使得代码更少,更容易理解。谢谢!【参考方案2】:

你可以试试这个

CREATE TABLE #TEST(ID INT,VALUE INT)
INSERT INTO #TEST VALUES
(1,10),(2,20),(3,30),(4,40),(5,50),(6,60),(7,70)

;WITH CTE
as
(
   SELECT ID,VALUE,VALUE AS RESULT FROM #TEST WHERE ID=1
   UNION ALL
   SELECT T.ID,T.VALUE,T.VALUE+C.RESULT
   FROM #TEST T INNER JOIN CTE C ON T.ID = C.ID+1
)

SELECT * FROM CTE

【讨论】:

非常感谢..这正是我正在寻找的逻辑,但我只想问一个问题:) 因为我是 CTE 的新手,那是 sql 中的内置函数吗? ,这是我要使用的第一个 :) 谢谢。 CTE 不是关键字或函数。尝试在谷歌上搜索“通用表表达式”。你会看到很多参考。干杯!【参考方案3】:

试试这个

select Id, value,
(select sum(t2.value) from TEST01 t2 where t2.id <= t1.id ) 
as Result
from TEST01 t1

在小提琴http://sqlfiddle.com/#!6/a8f56/2中寻找解决方案

【讨论】:

【参考方案4】:

你也可以使用窗口函数。

DECLARE @myTable TABLE(ID INT, val INT);

INSERT INTO @myTable VALUES (1,10),
                            (2,7),
                            (3,-4),
                            (4,1);
SELECT ID, 
       val,
       SUM(val) OVER (ORDER BY ID 
                      ROWS BETWEEN UNBOUNDED PRECEDING 
                      AND CURRENT ROW) AS result
FROM @myTable
ORDER BY ID;

ID  val  result
--  ---  ------
1   10   10
2   7    17
3   -4   13
4   1    14

【讨论】:

以上是关于如何连续添加起始行和下一行的值的主要内容,如果未能解决你的问题,请参考以下文章

仅显示 10 行和 1 页的 JQuery 数据表和按钮被禁用上一个和下一个

matplotlib set_yticks 删除 imshow 的上半行和下半行 [重复]

如何检查上一行和下一行的值

如何计算当前行与下一行?

VIM如何在特定几行前面加3个空格

sed 中如何替换换行符