[英]How do I efficiently extract multiple values from a temporary table?
我正在嘗試根據行號提取各種值並將其存儲到變量中,以便以后可以將這些變量用於某些分析。 當前,我需要從按順序輸入表格的日期開始的前7行中獲取值。 使用以下代碼,我可以獲得所需的特定值:
WITH tempTable AS
(
SELECT date, ROUND( SUM(size / 1024 / 1024 ) ) AS Size_Used FROM storageTable
group by date
order by date DESC
)
SELECT Size_Used INTO lastRowMinus0Value FROM
(
SELECT Size_Used, ROWNUM AS rn FROM
(
SELECT Size_Used FROM tempTable
ORDER BY date DESC
)
)
WHERE rn = lastRowMinus0;
但是,這樣做的效率非常低,因為每個變量都重復了此代碼,因此編譯時間很長。
我以為可能使UNION ALL成為提高代碼效率的方法,但是在嘗試運行它時,我總是遇到編譯錯誤:
WITH tempTable AS
(
SELECT date, ROUND( SUM(size / 1024 / 1024 ) ) AS Size_Used FROM storageTable
group by date
order by date DESC
)
SELECT Size_Used INTO lastRowMinus0Value FROM tempTable
WHERE ROWNUM = lastRowMinus0
UNION ALL
SELECT Size_Used INTO lastRowMinus1Value FROM tempTable
WHERE ROWNUM = lastRowMinus1;
如果有人可以就如何以更有效的方式提取值提供一些指導,我將不勝感激。
UNION ALL
會給出一個結果,其中包含第一查詢和第二查詢的所有行的總和。 您不能將其結果存儲到單獨的變量中。
如果您確實要使用UNION ALL
則應采用以下方法:
WITH TEMPTABLE AS (
SELECT
DATE,
ROUND(SUM(SIZE / 1024 / 1024)) AS SIZE_USED
FROM
STORAGETABLE
GROUP BY
DATE
ORDER BY
DATE DESC
)
SELECT
SUM(CASE ROWNUM
WHEN LASTROWMINUS0 THEN SIZE_USED
END),
SUM(CASE ROWNUM
WHEN LASTROWMINUS1 THEN SIZE_USED
END)
INTO
LASTROWMINUS0VALUE,
LASTROWMINUS1
FROM
TEMPTABLE
WHERE
ROWNUM IN (
LASTROWMINUS0,
LASTROWMINUS1
);
干杯!!
嘗試PIVOT
:
DECLARE
lastRowMinus0 NUMBER;
lastRowMinus1 NUMBER;
lastRowMinus2 NUMBER;
lastRowMinus3 NUMBER;
lastRowMinus4 NUMBER;
lastRowMinus5 NUMBER;
lastRowMinus6 NUMBER;
BEGIN
WITH t1 AS (SELECT
ROUND(SUM("size" / 1024 / 1024)) Size_Used,
ROW_NUMBER() OVER(ORDER BY "date" DESC) rn
FROM storageTable
GROUP BY "date")
SELECT
"1", "2", "3", "4", "5", "6", "7"
INTO lastRowMinus0, lastRowMinus1, lastRowMinus2, lastRowMinus3,
lastRowMinus4, lastRowMinus5, lastRowMinus6
FROM (SELECT * FROM t1 WHERE rn < 8) t2
PIVOT(SUM(Size_Used) FOR rn IN(1, 2, 3, 4, 5, 6, 7)) p;
DBMS_OUTPUT.PUT_LINE('lastRowMinus0: '||lastRowMinus0||CHR(10)||
'lastRowMinus1: '||lastRowMinus1||CHR(10)||
'lastRowMinus2: '||lastRowMinus2||CHR(10)||
'lastRowMinus3: '||lastRowMinus3||CHR(10)||
'lastRowMinus4: '||lastRowMinus4||CHR(10)||
'lastRowMinus5: '||lastRowMinus5||CHR(10)||
'lastRowMinus6: '||lastRowMinus6);
END;
使用db <> fiddle在線對其進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.