仅显示从特定时间段开始递增的记录

时间:2019-04-04 17:55:31

标签: sql sqlplus

在我的数据库中,有一个表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尚未从前一个日期的值开始增加,我想排除它。

1 个答案:

答案 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;