获取日期之间的 运行 总百分比差异的问题
Issue obtaining a running total percentage difference between dates
我遇到了查询问题,该查询正在按顺序转换为多个视图和完整过程
生成 table 以显示一天与下一天的差异。
老实说,在 SQL 服务器下,我可以通过单个查询来完成此操作。
然而,在 Oracle 11g 下,做同样的事情并在查询中完成它是非常困难的
运行 非常慢。 运行 我的查询现在需要超过 5 分钟,而且它不起作用。
我有一个table的数据
DATE SERVICE ENV RESPONSES
15-NOV-2016 PROD T1 4793
15-NOV-2016 PROD U1 3245
15-NOV-2016 PROD X1 4984
14-NOV-2016 PROD T1 5812
14-NOV-2016 PROD U1 3918
14-NOV-2016 PROD X1 3282
13-NOV-2016 PROD T1 11231
13-NOV-2016 PROD U1 1564
13-NOV-2016 PROD X1 2816
注意:此数据可追溯到几年前,涵盖 6 个环境
对于报告,我需要生成一个如下所示的结果集,
DATE ENV T1 U1 X1 TOTAL VARIANCE
20161115 PROD 4793 3245 4984 14022 +7.76%
20161114 PROD 5812 3918 3282 13012 -16.65%
20161113 PROD 11231 1564 2816 15611 +9.13%
当差异大于 +/- 10% 时,此报告将发布
此外,只想发送 3-5 行,而不是整个视图。
我尝试使用分区,但它使我的查询变慢,无法生成所需的数据。
该设计目前涉及创建 6 个单独的视图以连接到主视图 table 以透视数据
但是,我似乎无法获得正确的查询来生成方差。
方差计算为 ((当前日期总计 / 昨天总计) - 1) * 100
或 ((13012 / 15611) - 1.00) x 100 = -16.65
每个视图
CREATE OR REPLACE FORCE VIEW USAGE_T1
(
DATEREF,
REALM,
TOTAL
)
AS
SELECT DATE, ENV, TOTAL
FROM USAGE_COUNT
WHERE ENV = 'T1';
此查询构建了 table,但缺少方差
SELECT
TO_CHAR(base.ENDDATE, 'YYYYMMDD') AS DATEREF
, base.ENV
, T1.TOTAL AS "T1"
, U1.TOTAL AS "U1"
, X1.TOTAL AS "X1"
, NVL(T1.TOTAL, 0) + NVL(U1.TOTAL,0) + NVL(X1.TOTAL,0) AS "TOTAL"
FROM USAGE base
LEFT JOIN USAGE_T1 T1
ON T1.DATEREF = TO_CHAR(base.ENDDATE, 'YYYYMMDD')
LEFT JOIN USAGE_U1 U1
ON U1.DATEREF = TO_CHAR(base.ENDDATE, 'YYYYMMDD')
LEFT JOIN USAGE_X1 X1
ON X1.DATEREF = TO_CHAR(base.ENDDATE, 'YYYYMMDD')
WHERE base.ENV = 'PROD'
GROUP BY base.ENV, base.ENDDATE, T1.TOTAL, U1.TOTAL, X1.TOTAL
ORDER BY base.ENDDATE DESC;
非常感谢任何帮助。
谢谢
这就是你需要的,我想:
with t (dat, env, service, responses) as (
select to_date('15-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'T1', '4793' from dual union all
select to_date('15-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'U1', '3245' from dual union all
select to_date('15-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'X1', '4984' from dual union all
select to_date('14-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'T1', '5812' from dual union all
select to_date('14-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'U1', '3918' from dual union all
select to_date('14-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'X1', '3282' from dual union all
select to_date('13-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'T1', '11231' from dual union all
select to_date('13-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'U1', '1564' from dual union all
select to_date('13-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'X1', '2816' from dual)
select tt.*, (total / lag(total, 1, null) over (order by dat) - 1) * 100 variance
from (select to_char(dat, 'yyyymmdd') dat, t1, x1, u1, t1 + x1 + u1 total
from t
pivot (sum(responses) for service in ('T1' t1, 'X1' x1, 'U1' u1))
) tt;
此处:with t
构造-源数据,然后内部查询-枢轴为不同服务放入一行数据,然后在外部查询函数中lag
计算前一行值。有关详细信息,请参阅 lag function and pivot query.
上的文档
更新
lag
的工作原理:lag
取前一行的值。第一个参数是要获取数据的列的名称,第二个参数是当前行的行数(1 取前一行,前 2-2 行,等等),第三个参数 - 如果没有前一行则为默认值。行的顺序由 order 子句定义(上面的order by dat
)。要更改数据移动的方向,请更改使用函数 lead
的排序顺序 (asc/desc),它会返回下一行的值(几乎与 lag
相同)。
我遇到了查询问题,该查询正在按顺序转换为多个视图和完整过程 生成 table 以显示一天与下一天的差异。 老实说,在 SQL 服务器下,我可以通过单个查询来完成此操作。 然而,在 Oracle 11g 下,做同样的事情并在查询中完成它是非常困难的 运行 非常慢。 运行 我的查询现在需要超过 5 分钟,而且它不起作用。
我有一个table的数据
DATE SERVICE ENV RESPONSES
15-NOV-2016 PROD T1 4793
15-NOV-2016 PROD U1 3245
15-NOV-2016 PROD X1 4984
14-NOV-2016 PROD T1 5812
14-NOV-2016 PROD U1 3918
14-NOV-2016 PROD X1 3282
13-NOV-2016 PROD T1 11231
13-NOV-2016 PROD U1 1564
13-NOV-2016 PROD X1 2816
注意:此数据可追溯到几年前,涵盖 6 个环境
对于报告,我需要生成一个如下所示的结果集,
DATE ENV T1 U1 X1 TOTAL VARIANCE
20161115 PROD 4793 3245 4984 14022 +7.76%
20161114 PROD 5812 3918 3282 13012 -16.65%
20161113 PROD 11231 1564 2816 15611 +9.13%
当差异大于 +/- 10% 时,此报告将发布
此外,只想发送 3-5 行,而不是整个视图。 我尝试使用分区,但它使我的查询变慢,无法生成所需的数据。
该设计目前涉及创建 6 个单独的视图以连接到主视图 table 以透视数据 但是,我似乎无法获得正确的查询来生成方差。 方差计算为 ((当前日期总计 / 昨天总计) - 1) * 100 或 ((13012 / 15611) - 1.00) x 100 = -16.65
每个视图
CREATE OR REPLACE FORCE VIEW USAGE_T1
(
DATEREF,
REALM,
TOTAL
)
AS
SELECT DATE, ENV, TOTAL
FROM USAGE_COUNT
WHERE ENV = 'T1';
此查询构建了 table,但缺少方差
SELECT
TO_CHAR(base.ENDDATE, 'YYYYMMDD') AS DATEREF
, base.ENV
, T1.TOTAL AS "T1"
, U1.TOTAL AS "U1"
, X1.TOTAL AS "X1"
, NVL(T1.TOTAL, 0) + NVL(U1.TOTAL,0) + NVL(X1.TOTAL,0) AS "TOTAL"
FROM USAGE base
LEFT JOIN USAGE_T1 T1
ON T1.DATEREF = TO_CHAR(base.ENDDATE, 'YYYYMMDD')
LEFT JOIN USAGE_U1 U1
ON U1.DATEREF = TO_CHAR(base.ENDDATE, 'YYYYMMDD')
LEFT JOIN USAGE_X1 X1
ON X1.DATEREF = TO_CHAR(base.ENDDATE, 'YYYYMMDD')
WHERE base.ENV = 'PROD'
GROUP BY base.ENV, base.ENDDATE, T1.TOTAL, U1.TOTAL, X1.TOTAL
ORDER BY base.ENDDATE DESC;
非常感谢任何帮助。
谢谢
这就是你需要的,我想:
with t (dat, env, service, responses) as (
select to_date('15-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'T1', '4793' from dual union all
select to_date('15-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'U1', '3245' from dual union all
select to_date('15-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'X1', '4984' from dual union all
select to_date('14-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'T1', '5812' from dual union all
select to_date('14-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'U1', '3918' from dual union all
select to_date('14-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'X1', '3282' from dual union all
select to_date('13-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'T1', '11231' from dual union all
select to_date('13-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'U1', '1564' from dual union all
select to_date('13-NOV-2016', 'dd-mon-yyyy'), 'PROD', 'X1', '2816' from dual)
select tt.*, (total / lag(total, 1, null) over (order by dat) - 1) * 100 variance
from (select to_char(dat, 'yyyymmdd') dat, t1, x1, u1, t1 + x1 + u1 total
from t
pivot (sum(responses) for service in ('T1' t1, 'X1' x1, 'U1' u1))
) tt;
此处:with t
构造-源数据,然后内部查询-枢轴为不同服务放入一行数据,然后在外部查询函数中lag
计算前一行值。有关详细信息,请参阅 lag function and pivot query.
更新
lag
的工作原理:lag
取前一行的值。第一个参数是要获取数据的列的名称,第二个参数是当前行的行数(1 取前一行,前 2-2 行,等等),第三个参数 - 如果没有前一行则为默认值。行的顺序由 order 子句定义(上面的order by dat
)。要更改数据移动的方向,请更改使用函数 lead
的排序顺序 (asc/desc),它会返回下一行的值(几乎与 lag
相同)。