作为输入,我有3个字段:

  • Column_A:按时间顺序表示调查的步骤
  • Column_B:表示参与调查步骤的人数
  • Column_C:表示在此特定调查步骤中成功完成的人数(B&>;=C)

现在我需要计算一个新的COLUMN_D:此列需要表示参与者的总数,这些参与者在前面的所有步骤之后仍保持成功.因此,这个数字充其量只能保持不变或在每个步骤之后在参与者不成功的情况下减少.

在Excel中,这很容易,因为我会在那里计算(第1行除外): 前一行的Value_D-(Value_B-Value_C).

我知道SQL中的滞后和领先,但我如何才能考虑同一列的前一行的计算?它以某种方式起作用了吗?我需要编写递归CTE之类的代码吗?

我认为最大的问题是:行数(Column_A)不一样,所以我不能只把几个CTE粘在一起.

Column_A Column_B Column_C Column_D
0 35 35 35
1 35 35 35
2 35 34 34
3 34 33 33
4 33 30 30
5 33 31 28
6 33 33 28

我try 了下面的方法,但显然它返回了错误的结果,因为它没有考虑到前面的计算.

SELECT [Column_A]
      ,[Column_B]
      ,[Column_C]
      , CASE WHEN [Column_A] = 0 
             THEN [Column_B]
             ELSE LAG([Column_C], 1, 0) OVER (PARTITION BY 1 
                                              ORDER     BY [Column_A] ASC) - ([Column_B] - [Column_C])
        END AS [Column_D]
FROM dataset

推荐答案

您可以组合两个窗口函数:

  • FIRST_VALUE,收集第一个"Column_D"值
  • SUM,收集"Column_B"和"Column_C"之间的运行差异

然后从第一个窗口函数中减go 第二个窗口函数.

SELECT *, FIRST_VALUE(Column_D) OVER(ORDER BY Column_A ROWS UNBOUNDED PRECEDING) - 
          SUM(Column_B - Column_C) OVER(ORDER BY Column_A ROWS UNBOUNDED PRECEDING) 
FROM tab

Output:

Column_A Column_B Column_C Column_D (No column name)
0 35 35 35 35
1 35 35 35 35
2 35 34 34 34
3 34 33 33 33
4 33 30 30 30
5 33 31 28 28
6 33 33 28 28

查看演示here.

Sql相关问答推荐

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

使用Lead获取下一个不同的日期

Lag()函数的差异:R与SQL(将R代码转换为SQL)

SQL:如何将相应位置的两个数组中的元素组合在一起

将Dense_RANK列为聚合(非解析)函数(&A)

每小时 Select 1行

Select 列组(按同一表格中的另一列分组)Laravel 10

SQL到Snowflake-转换嵌套的SELECT(值

在Athena中使用regexp提取括号前的字符串值

为什么左联接结果在MS Access数据库中不匹配

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

获取分布在同一行的列中的出现次数

如何判断小数点后千位是否不为0

根据要过滤的列的值进行联接和分组

什么是 100.它与 100 有什么区别?

SQL Server 查找存在于所有不同时期(或序列)中的条目

如何找到特定时间间隔内的最大和最小日期?

sql count distinct by column 和 sum false 和 true

Amazon Redshift - 子计划的哈希表不存在