[英]Oracle PL/SQL : Accessing previous row calculated value in current row
[英]add current row value with previous row calculated value
我有一張桌子,如下所示
OwnerId StartDate EndDate Volume
1 2020-01-01 2020-01-01 10.80
1 2020-01-02 2020-01-02 5.60
1 2020-01-03 2020-01-03 7.90
1 2020-01-04 2020-01-04 8.50
另一個具有以前值的表。
OwnerId PreviousVolume
1 0.70
1) 上一卷應該添加我的第一個表第一行。 然后得到整數部分和小數部分值。
2)小數部分與第一個表格第二行相加,然后得到整數和小數部分,反之亦然。
ownerid startdate enddate Volume Calculatedvolume remainingexisting
1 2020-01-01 2020-01-01 10.80 11 0.50
1 2020-01-02 2020-01-02 5.60 6 0.10
1 2020-01-03 2020-01-03 7.90 8 0.00
1 2020-01-04 2020-01-04 8.50 8 0.50
你能請任何人幫忙嗎?
我認為這種查詢可能適用於您的問題,但我對 LEAD()(或 LAG()?)函數還有另一個想法,如果這不起作用,我將編輯我的答案並添加它:
DECLARE @count = 1;
SELECT TOP 1
ROW_NUMBER() OVER (PARTITION BY T1.OwnerId ORDER BY T1.startdate,T1.enddate) R#
,T1.OwnerId
,T1.StartDate
,T1.EndDate
,T1.Volume
,FLOOR(T1.Volumn+T2.PreviousVolum) AS Calculatedvolume
,(T1.Volumn+T2.PreviousVolum)%1 AS remainingexisting
INTO #tmp
FROM T1
INNER JOIN T2 ON T1.OwnerId = T2.OwnerId
ORDER BY T1.startdate,T1.enddate;
WHILE @count > (SELECT COUNT(*) FROM T1)
BEGIN
INSERT INTO #tmp
SELECT
@count+1
,T1.OwnerId
,T1.StartDate
,T1.EndDate
,T1.Volume
,FLOOR(T1.Volumn+T2.Calculatedvolume) AS Calculatedvolume
,(T1.Volumn+T2.Calculatedvolume)%1 AS remainingexisting
FROM T1
INNER JOIN #tmp T2 ON T1.OwnerId = T2.OwnerId AND T2.R# = @count
WHERE ROW_NUMBER() OVER (ORDER BY T1.startdate,T1.enddate) = @count+1;
SET @count += 1;
END
如果我正確理解您的問題,下一個語句可能有助於獲得您的預期結果:
表格:
CREATE TABLE Table1 (
OwnerId int,
StartDate date,
EndDate date,
Volume numeric(10, 2)
)
INSERT INTO Table1
(OwnerId, StartDate, EndDate, Volume)
VALUES
(1, '20200101', '20200101', 10.80),
(1, '20200102', '20200102', 5.60),
(1, '20200103', '20200103', 7.90),
(1, '20200104', '20200104', 8.50)
CREATE TABLE Table2 (
OwnerId int,
PreviousVolume numeric(10, 2)
)
INSERT INTO Table2
(OwnerId, PreviousVolume)
VALUES
(1, 0.70)
陳述:
;WITH DataCte AS (
SELECT OwnerId, NULL AS StartDate, NULL AS EndDate, PreviousVolume AS Volume
FROM Table2
UNION ALL
SELECT OwnerId, StartDate, EndDate, Volume
FROM Table1
), CalculationCTE AS (
SELECT
OwnerId, StartDate, EndDate, Volume,
SUM(Volume) OVER (PARTITION BY OwnerId ORDER BY StartDate) AS Total,
CONVERT(numeric(10, 2), FLOOR(SUM(Volume) OVER (PARTITION BY OwnerId ORDER BY StartDate))) AS TotalFloor
FROM DataCTE
)
SELECT
OwnerId, StartDate, EndDate,
FLOOR(Total - LAG(TotalFloor) OVER (PARTITION BY OwnerID ORDER BY StartDate)) AS CalculatedVolume,
Total - TotalFloor AS RemainingExisting
FROM CalculationCTE
結果:
---------------------------------------------------------------------
OwnerId StartDate EndDate CalculatedVolume RemainingExisting
---------------------------------------------------------------------
1 NULL NULL NULL 0.70
1 2020-01-01 2020-01-01 11 0.50
1 2020-01-02 2020-01-02 6 0.10
1 2020-01-03 2020-01-03 8 0.00
1 2020-01-04 2020-01-04 8 0.50
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.