在 SQL Server 中使用上一行和下一行值 (LAG & LEAD) 计算总结束数量

Posted

技术标签:

【中文标题】在 SQL Server 中使用上一行和下一行值 (LAG & LEAD) 计算总结束数量【英文标题】:Calculate Total Ending Quantity by using previous and next row value (LAG & LEAD) in SQL Server 【发布时间】:2018-03-25 06:13:17 【问题描述】:

使用 SQL Server 中的上一行和下一行值 (LAG & LEAD) 计算总结束数量。这是输入数据。

输入数据

Date         Account    Type    Quantity
12/28/2007         A    2N         719
3/28/2008          A    2N         806
6/27/2008          A    2N         622
9/26/2008          A    2N         748
12/26/2008         A    2N         757

预期的输出数据/期望的结果

"Date"  "Account" "Type"    "Quantity" "Beginning Qty" "Net Change" "Zero Beginning Qty" "End Qty"
12/28/2007  A        2N      719        n/a             n/a          n/a    0
3/28/2008   A        2N      806        719             87            0    87
6/27/2008   A        2N      622        806            -184           87  -96
9/26/2008   A        2N      748        622             126          -96   29
12/26/2008  A        2N      757        748              9            29   38




select      Date, Account, Type, Quantity
    ,  LAG(Quantity, 1,0) OVER (ORDER BY Date) as  [Beginning Qty]
    ,  Quantity- LAG(Quantity,1,0) OVER (ORDER BY Date) AS [Net_Change_Qty]
    , (Quantity- LAG(Sec_Share_Qty,1,0) OVER (ORDER BY Date)) + LEAD(Quantity, 1,0) OVER (ORDER BY Date)) as [Zero_Qty_Beginning]
    ,[Net_Change_Qty] + [Zero_Qty_Beginning] as [End Qty]
from        Table
order by    [Date]

现有查询适用于开始和净更改列。但是,对于“零起始数量”列,此代码没有给出预期的输出。

当前不正确的结果

Date    Account Type    Quantity    Beginning Quantity  Net Change  Zero Beginning Qty  End Quantity
12/28/2007  A   2N      719      0      719 1525    NULL
3/28/2008   A   2N      806    719       87 710     NULL
6/27/2008   A   2N      622    806     -184 564     NULL
9/26/2008   A   2N      748    622      126 883     NULL
12/26/2008  A   2N      757    748        9 765     NULL

【问题讨论】:

里面有问题吗?请edit您的问题将示例数据包含为 DDL+DML(创建表并插入语句),并显示所需的结果与您当前的结果。 “不工作”是什么意思“你想要什么结果? 【参考方案1】:

您尝试嵌套分析函数,这是不允许的。

根据您的预期结果,您的所有计算似乎都基于两个值:前一行中的数量和第一行。

with cte as
 (
   select      Date, Account, Type, Quantity
    ,  LAG(Quantity, 1) OVER (ORDER BY Date) AS LagQty -- previous row
    ,  first_value(Quantity) OVER (ORDER BY Date) AS firstQty -- first row
   from        Tab
 )
select Date, Account, Type, Quantity
  ,LagQty as [Beginning Qty]
  ,Quantity - LagQty AS [Net_Change_Qty]
  ,LagQty - firstQty AS [Zero_Qty_Beginning]
  ,Quantity - firstQty AS [End_Qty]
from cte
order by    [Date]

【讨论】:

以上是关于在 SQL Server 中使用上一行和下一行值 (LAG & LEAD) 计算总结束数量的主要内容,如果未能解决你的问题,请参考以下文章

SparkSql 查询以从 cassandra 获取定义值的上一行和下一行

使用 jQuery 检索表中的上一行和下一行

用前一行和下一行的平均值填充 NaN 值 - Python

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

PySpark - 将上一行和下一行附加到当前行

如何将另一行中的值插入列中 - SQL Server