SQL—前几行减法的总和(逐行)

SQL—前几行减法的总和(逐行),sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我对SQL有问题 a列-指定交付的产品到期的日期 b栏-交货数量 c栏-累计产品交付量 d列-到给定到期日的累计产品销售额 我需要计算任何交付的产品中有多少过期,因为使用先进先出的方法没有及时售出。因此,根据给定的示例,从第一次交付开始,所有产品均已售出,从第二次交付开始,仅售出1件产品,3件过期,从第三次交付开始,所有产品均已过期,从第四次交付开始,所有产品均已售出,从第五次交付开始,仅售出2件产品,3件过期,以此类推 我试过在上面使用sum(),但它是对b列和c列求和,然后将它们总计减去

我对SQL有问题

  • a列-指定交付的产品到期的日期
  • b栏-交货数量
  • c栏-累计产品交付量
  • d列-到给定到期日的累计产品销售额
我需要计算任何交付的产品中有多少过期,因为使用先进先出的方法没有及时售出。因此,根据给定的示例,从第一次交付开始,所有产品均已售出,从第二次交付开始,仅售出1件产品,3件过期,从第三次交付开始,所有产品均已过期,从第四次交付开始,所有产品均已售出,从第五次交付开始,仅售出2件产品,3件过期,以此类推

我试过在上面使用sum(),但它是对b列和c列求和,然后将它们总计减去,而不是逐行减去

我想我想要实现的是某种循环(因为它基于前几行计算的结果),不幸的是,我不知道如何进行循环,所以请帮助我:)

我用的是雪花


我认为您不需要“前几行”我认为您需要“更早的日期”有很大的不同是的,更早的日期,对不起。如果是这种情况,您不需要循环,您只需要一个子查询,根据日期进行筛选我不理解。示例中的屏幕是我的表格,我有一个所有交付的列表,对于每次交付,我必须计算有多少产品将过期,但我还需要知道有多少产品在该日期之前过期。例如,其中一次交付的产品将于2020-11-09(第5行)到期,在该日之前,仅销售了15种产品,而所有交付的总和为29,因此,我需要检查以前交付的产品中有多少已经过期,并将其计算出来,然后我的结果应该是:从这次交付中,每5个产品中就有3个过期。
calculation
的值肯定可以使用递归查询来计算(带有min
a
的行是种子行,使用您详细描述的公式计算下一个最近的行,可能使用
case when
语句表示
结果>0
条件)但是,如果我是你,我会首先尝试推导一些明确的公式来计算。由于
calc1=d1-c1
calc2=d2-c2-calc1
calc3=d3-c3-(calc2+calc1)=d3-c3-(d2-c2)
calc4=d4-c4-(d3-c3)
等,粗略的运行值可以计算为
d-c-(d-c)over
。对
>0的清理会让它变得更难。我不认为你想要“前几行”我认为你想要“更早的日期”有很大的不同是的,更早的日期,对不起。如果是这样的话,你不需要循环,你只需要一个按日期过滤的子查询我不理解。示例中的屏幕是我的表,我有一个所有d的列表eliveries和对于每次交付,我必须计算有多少产品将过期,但我还需要知道有多少产品在该日期之前过期。例如,其中一次交付的产品将在2020-11-09(第5行)过期直到那天为止,只有15个产品售出,而所有交付的总和是29个,所以我需要检查有多少产品已经从以前的交付中过期,并进行计算,然后我的结果应该是:从这次交付中,每5个产品中有3个过期。
calculation
的值肯定可以使用递归q计算uery(带有min
a
的行是种子行,下一个最近的行是使用您详细描述的公式计算的,可能使用
case when
语句来表示
结果>0
条件)但是,如果我是你,我会首先尝试推导一些明确的公式来计算。由于
calc1=d1-c1
calc2=d2-c2-calc1
calc3=d3-c3-(calc2+calc1)=d3-c3-(d2-c2)
calc4=d4-c4-(d3-c3)
等,粗略的运行值可以计算为
d-c-(d-c)over
。但是,对
>0
进行消毒会更困难。