Sql 如何从第二列运行总计

Sql 如何从第二列运行总计,sql,oracle,lag,window-functions,analytic-functions,Sql,Oracle,Lag,Window Functions,Analytic Functions,我有一个如下的数据集 Lot Size Reported QTY Qty Balance 150 100 150 100 150 80 150 80 150 5 数量余额需要按如下方式计算: Row 1 = Lot Size - Reported Qty (row1)

我有一个如下的数据集

Lot Size    Reported QTY    Qty Balance
150          100            
150          100            
150          80             
150          80            
150          5              
数量余额需要按如下方式计算:

Row 1 = Lot Size - Reported Qty (row1) => 150-100 = 50
Row 2 = Reported Qty (row1) - Reported Qty(row2) => 100-100 =0
Row 3 = Reported Qty (row2) - Reported Qty(row3) => 100-80 =20
... till the last row
我的预期结果是

Lot Size    Reported QTY    Qty Balance
150          100            50
150          100            0
150          80             20
150          80             0
150          5              75

如何在查询中实现这一点?

您应该看看
LAG()
分析函数。有关函数及其接受的参数的详细信息,请参阅(例如,我认为当lag()函数返回null时,需要传入lot_size列的默认值)

一旦确定了前一行的报告数量值,就可以简单地减去它。当然,您需要某种方法来确定行的顺序—您的示例数据似乎没有,因此数据库将无法确定哪一行是第一行,哪一行是最后一行

例如


正如@Boneist所建议的,您需要使用LAG()OVER()分析函数

您只需再执行一个任务来处理将为空的第一行,使用CASE就可以使它工作

测试用例

SQL> WITH data AS
  2    ( SELECT t.*, lag(reported_qty) OVER(ORDER BY NULL) rn FROM t
  3    )
  4  SELECT lot_size,
  5    reported_qty,
  6    CASE
  7      WHEN rn IS NULL
  8      THEN lot_size     - reported_qty
  9      ELSE rn - reported_qty
 10    END qty_balance
 11  FROM data;

  LOT_SIZE REPORTED_QTY QTY_BALANCE
---------- ------------ -----------
       150          100          50
       150          100           0
       150           80          20
       150           80           0
       150            5          75

SQL>

Oracle 11g R2架构设置

CREATE TABLE lots ( Lot_Size, Reported_QTY ) AS
          SELECT 150, 100 FROM DUAL
UNION ALL SELECT 150, 100 FROM DUAL
UNION ALL SELECT 150,  80 FROM DUAL
UNION ALL SELECT 150,  80 FROM DUAL
UNION ALL SELECT 150,   5 FROM DUAL;
SELECT Lot_Size,
       Reported_QTY,
       COALESCE( LAG( Reported_QTY ) OVER ( ORDER BY NULL ) - Reported_QTY,
                 Lot_Size - Reported_QTY ) AS Qty_Balance
FROM   Lots
| LOT_SIZE | REPORTED_QTY | QTY_BALANCE |
|----------|--------------|-------------|
|      150 |          100 |          50 |
|      150 |          100 |           0 |
|      150 |           80 |          20 |
|      150 |           80 |           0 |
|      150 |            5 |          75 |
查询1

CREATE TABLE lots ( Lot_Size, Reported_QTY ) AS
          SELECT 150, 100 FROM DUAL
UNION ALL SELECT 150, 100 FROM DUAL
UNION ALL SELECT 150,  80 FROM DUAL
UNION ALL SELECT 150,  80 FROM DUAL
UNION ALL SELECT 150,   5 FROM DUAL;
SELECT Lot_Size,
       Reported_QTY,
       COALESCE( LAG( Reported_QTY ) OVER ( ORDER BY NULL ) - Reported_QTY,
                 Lot_Size - Reported_QTY ) AS Qty_Balance
FROM   Lots
| LOT_SIZE | REPORTED_QTY | QTY_BALANCE |
|----------|--------------|-------------|
|      150 |          100 |          50 |
|      150 |          100 |           0 |
|      150 |           80 |          20 |
|      150 |           80 |           0 |
|      150 |            5 |          75 |

CREATE TABLE lots ( Lot_Size, Reported_QTY ) AS
          SELECT 150, 100 FROM DUAL
UNION ALL SELECT 150, 100 FROM DUAL
UNION ALL SELECT 150,  80 FROM DUAL
UNION ALL SELECT 150,  80 FROM DUAL
UNION ALL SELECT 150,   5 FROM DUAL;
SELECT Lot_Size,
       Reported_QTY,
       COALESCE( LAG( Reported_QTY ) OVER ( ORDER BY NULL ) - Reported_QTY,
                 Lot_Size - Reported_QTY ) AS Qty_Balance
FROM   Lots
| LOT_SIZE | REPORTED_QTY | QTY_BALANCE |
|----------|--------------|-------------|
|      150 |          100 |          50 |
|      150 |          100 |           0 |
|      150 |           80 |          20 |
|      150 |           80 |           0 |
|      150 |            5 |          75 |

所有伟大的答案。。谢谢大家!!我只是选择了最适合我的答案作为最佳答案。你不需要案例陈述——你可以完全在滞后函数中完成。我用一个例子更新了我的答案。@Boneist是的,很微妙<代码>偏移量和
默认值
是键。说得好,谢谢。@Boneis很抱歉拼错了你的名字。。。顺便说一下,有一天我们见面的时候,我们可以一起创作一些好音乐。我将向你展示我的吉他和歌唱技巧:-)没关系;我见过各种各样的变奏*{;-)不过,我不太确定吉他和长号是否能很好地混合!你不需要合并-你可以完全在滞后函数内完成。我用一个例子更新了我的答案。