在我的数据库中,有一个表ITEM_POWER,它包含ID#,READ_TIME和POWER_COUNT。
每次关闭电源时,表中的POWER_COUNT +1加1。如果一个项目从未关闭过,则可能有0个POWER_COUNT;如果关闭了1000次,则可能有1000个POWER_COUNT。
我想显示在特定时间范围内其POWER_COUNT增加了1的项目,相比之下,最近时间范围内的POWER_COUNT增加了。
当前我的查询如下所示:
SELECT ID, READ_TIME, POWER_COUNT
FROM ITEM_POWER WHERE READ_TIME BETWEEN '31-MAR-19' and '05-APR-19'
AND POWER_COUNT > POWER_COUNT BETWEEN READ_TIME OF '24-MAR-19' AND '29-MAR-19'
GROUP BY ID, READ_TIME, POWER_COUNT
ORDER BY ID, READ_TIME, POWER_COUNT
很显然,我不相信我的行“ AND POWER_COUNT> POWER_COUNT在READ_TIME OF '24 -MAR-19'和'29 -MAR-19'之间有效,这就是我要完成的工作。我想比较本周和上周的power_counts,如果power_count增加,我要显示READ_TIME和新的POWER_COUNT。
样本数据:
ID READ_TIME POWER_COUNT
------------ --------- -----------
1234567 09-MAR-19 121
1234567 10-MAR-19 121
1234567 11-MAR-19 121
1234567 12-MAR-19 121
1234567 13-MAR-19 123
1234567 14-MAR-19 130
在上述数据中,ID 1234567的“ POWER_COUNT”在'13 -MAR-19'上从121增加到123。对于此示例,假设我想将“ 13-MAR-19”和“ 14-MAR-19”之间的POWER_COUNT与“ 12-MAR-19”处的POWER_COUNT进行比较。由于此后POWER_COUNT已增加,因此我希望该ID显示在报告中。如果POWER_COUNT尚未从前一个日期的值开始增加,我想排除它。
答案 0 :(得分:1)
根据示例数据,您只需要lag()
:
SELECT ID, READ_TIME, POWER_COUNT
FROM (SELECT IP.*,
LAG(POWER_COUNT) OVER (PARTITION BY ID ORDER BY READ_TIME) as PREV_POWER_COUNT
FROM ITEM_POWER IP
) IP
WHERE READ_TIME >= DATE '2019-03-21' AND
READ_TIME < '2019-04-06' AND
POWER_COUNT <> PREV_POWER_COUNT
ORDER BY ID, READ_TIME, POWER_COUNT;