使用 LAG Window 函数计算 Oracle 中记录的剩余总数

Calculate Remaining Total by Record in Oracle Using LAG Window Function

我在使用 Oracle 12 使用 LAG window 函数来制作我最能描述为总计 运行 的分类帐时遇到了困难。我已经抽象出这样的问题:

我有一架固定座位的客机,但有时航班超卖。我试图通过使用 运行 总数来弄清楚谁得到了票,谁没有得到票。

对于每位乘客 (PASS),我已按 class(1=1st class,2=经济舱)和其中的优先级(谁先订购)对数据进行了排序。

在 REM 列中,我试图获得 运行 剩余座位的总数。我假设每个 PASS 只占用一个席位,并且每个 class 我有固定数量的 AVAIL 席位。该乘客就座后剩余的座位 (REM) 将按分区中每个用户一个减少。期望的结果如下所示:

PASS |PRI|CLASS|AVAIL|REM
User9 1   1     2     1
User1 4   1     2     0
User8 2   2     3     2
User4 3   2     3     1
User3 5   2     3     0
USER2 6   2     3     -1

我一直在尝试这样做:

SELECT 
    PASS, PRI, CLASS,
    LAG(AVAIL, 1, AVAIL) OVER (PARTITION BY CLASS ORDER BY CLASS, PRI) - 1 AS REM
FROM TABLE
ORDER BY CLASS, PRI

但我的 REM 最终数据出现错误:

PASS |PRI|CLASS|AVAIL|REM
User9 1   1     2     1
User1 4   1     2     1
User8 2   2     3     2
User4 3   2     3     2
User3 5   2     3     2
USER2 6   2     3     2

我的 window 函数显然是在处理这个错误,因为它正在分区中寻找下一个 AVAIL 记录并减去一个,但是 AVAIL 没有改变,所以我得到了相同的值REM 跨分区。

如何让 REM 从分区中的 AVAIL 中减去 1,然后在下一行中将新值用于 AVAIL?

只需从 avail 列中减去 运行 总和。

SELECT PASS, PRI, CLASS, AVAIL,
avail-sum(1) over(partition by class order by pri) AS REM
FROM TABLE

这似乎符合您的描述:

AVAIL 
- Count(*)
  Over (PARTITION BY CLASS 
        ORDER BY PRI ROWS Unbounded Preceding)

可用座位减去每个 class 的累计行数。

累积计数等于ROW_NUMBER:

AVAIL 
- ROW_NUMBER()
  Over (PARTITION BY CLASS 
        ORDER BY PRI)