【发布时间】:2019-07-14 18:24:02
【问题描述】:
我正在尝试做的是根据它们的行号提取各种值并将它们存储到变量中,以便以后可以将这些变量用于某些分析。目前我需要从前 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;
如果有人能就如何以更有效的方式提取价值提供一些指导,我将不胜感激。
【问题讨论】:
-
请解释什么是
lastRowMinus0+lastRowMinus1值 - 表中没有这样的列。通常,如果您只想选择前 7 个日期,则不要对所有可能的日期运行 GROUPBY+SUM 查询 - 使用 WHERE 子句,条件如下:date <= ALL (SELECT 7 first dates from the table),并在date列上创建索引 - 这应该会加快大大提高您的查询。
标签: sql oracle common-table-expression