是否有 Oracle 分析函数来帮助计算账单日之间的最大值?
Is there an Oracle analytic function to help compute max value between billing days?
问题:
我需要帮助添加一个 PERIOD_MAX 列,该列计算计费周期之间的最大 DAILY_USAGE 值。有没有 Oracle Analytic Function 可以帮助我?
注意:新的 PERIOD_MAX 列应指示 'Y' 当该行等于自上一个账单日以来所有行中 DAILY_USAGE 值的最大值(黑色-边框框,由 BILLING_DAY).
分隔
我希望它看起来如何:
以下是每一列的说明:
- READ_TIME:每天早上抄表的时间
- BILLING_DAY:表示一个计费周期结束的分隔符;我们在这一天向客户收费。由于记录的数量是任意的,我们可能会也可能不会得到每周开始的 BILLING_DAY='Y'。 (这就是第21行被故意排除的原因。)
- METER_READING:表面上的读数。向上累计。
- DAILY_USAGE:自上次读取以来消耗的能量。
- PERIOD_MAX:我需要一个专栏来帮助我突出显示每个计费周期内的阅读峰值。
这是一个 Oracle 查询:
请从这个查询开始,它生成的数据就像它存在于我的数据库中一样,然后尝试添加所需的 PERIOD_MAX 列。
SELECT READ_TIME, BILLING_DAY, SUM (DAILY_USAGE) OVER (ORDER BY READ_TIME) + 1000 AS METER_READING, DAILY_USAGE
FROM (SELECT X.SEQ + TRUNC (SYSDATE - 20) + DBMS_RANDOM.VALUE / 8 + 0.3 AS READ_TIME
, CASE WHEN X.SEQ / 7 = TRUNC (X.SEQ / 7) THEN 'Y' ELSE NULL END AS BILLING_DAY
, ROUND (DBMS_RANDOM.VALUE * 100, 2) AS DAILY_USAGE
FROM ( SELECT LEVEL AS SEQ FROM DUAL
CONNECT BY LEVEL <= 20) X) Y ORDER BY READ_TIME;
感谢您的帮助。
您可以对 billing_day
进行累加(或真正计数)以生成一个组。然后,做组内最大值:
select t.*,
(case when row_number() over (partition by period order by daily_usage desc) = 1
then 'Y' else 'N'
end) as period_max
from (select t.*,
count(billing_day) over (order by reading_day) as period
from t
) t;
问题:
我需要帮助添加一个 PERIOD_MAX 列,该列计算计费周期之间的最大 DAILY_USAGE 值。有没有 Oracle Analytic Function 可以帮助我?
注意:新的 PERIOD_MAX 列应指示 'Y' 当该行等于自上一个账单日以来所有行中 DAILY_USAGE 值的最大值(黑色-边框框,由 BILLING_DAY).
分隔我希望它看起来如何:
以下是每一列的说明:
- READ_TIME:每天早上抄表的时间
- BILLING_DAY:表示一个计费周期结束的分隔符;我们在这一天向客户收费。由于记录的数量是任意的,我们可能会也可能不会得到每周开始的 BILLING_DAY='Y'。 (这就是第21行被故意排除的原因。)
- METER_READING:表面上的读数。向上累计。
- DAILY_USAGE:自上次读取以来消耗的能量。
- PERIOD_MAX:我需要一个专栏来帮助我突出显示每个计费周期内的阅读峰值。
这是一个 Oracle 查询:
请从这个查询开始,它生成的数据就像它存在于我的数据库中一样,然后尝试添加所需的 PERIOD_MAX 列。
SELECT READ_TIME, BILLING_DAY, SUM (DAILY_USAGE) OVER (ORDER BY READ_TIME) + 1000 AS METER_READING, DAILY_USAGE
FROM (SELECT X.SEQ + TRUNC (SYSDATE - 20) + DBMS_RANDOM.VALUE / 8 + 0.3 AS READ_TIME
, CASE WHEN X.SEQ / 7 = TRUNC (X.SEQ / 7) THEN 'Y' ELSE NULL END AS BILLING_DAY
, ROUND (DBMS_RANDOM.VALUE * 100, 2) AS DAILY_USAGE
FROM ( SELECT LEVEL AS SEQ FROM DUAL
CONNECT BY LEVEL <= 20) X) Y ORDER BY READ_TIME;
感谢您的帮助。
您可以对 billing_day
进行累加(或真正计数)以生成一个组。然后,做组内最大值:
select t.*,
(case when row_number() over (partition by period order by daily_usage desc) = 1
then 'Y' else 'N'
end) as period_max
from (select t.*,
count(billing_day) over (order by reading_day) as period
from t
) t;