使用 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)
我在使用 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)