簡體   English   中英

使用LAG窗口函數按Oracle中的記錄計算剩余總數

[英]Calculate Remaining Total by Record in Oracle Using LAG Window Function

我很難使用LAG窗口函數來做出最能描述的分類帳,而使用Oracle 12可以實現總帳。我已經將問題抽象為:

我有一架座機,座位數固定,但有時航班超賣了。 我試圖通過運行總計來找出誰獲得票證,而誰沒有獲得票證。

對於每位乘客(PASS),我已經按等級(1 = 1等級,2 =經濟)和其中的優先級(先訂購者)對數據進行了排序。

在“ REM”列中,我試圖獲取剩余的剩余席位總數。 我假設每個PASS僅占用一個座位,並且每個班級都有固定數量的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

我顯然用我的窗口函數來解決這個問題,因為它正在尋找分區中的下一個AVAIL記錄並減去一個,但是AVAIL並沒有改變,因此我在整個分區中獲得相同的REM值。

如何獲得REM從分區中的AVAIL中減去1,然后在下一行中將新值用於AVAIL?

這似乎符合您的描述:

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

可用座位數減去每個班級的累積行數。

累計計數等於ROW_NUMBER:

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

只需從avail列中減去運行總和。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM