繁体   English   中英

Oracle-根据值和下一行带回上一行

[英]Oracle - Bring Back previous Row based on Value and Next row

我有一个小问题,我一直在努力解决...

数据库显示特定单元的不可用记录。如果该单元处于运行状态,则记录为0,不可用;当该单元处于关闭状态时,记录为3600(秒)。 当记录在其中一个字段中具有3600时,则将1放置在另一个字段中以将其显示为“服务中断”(COOS)。

我已经能够搜索记录以显示所有当前的COOS,但是我需要做的就是搜索并显示何时一个单元故障以及何时恢复。

所以我需要在数据库中搜索“ 3600”的第一个实例,然后带回显示“ 0”的上一个记录,然后再次带回显示“ 0”的下一个记录,这将告诉我该单元格的日期/时间下去了。

这是数据示例:

在此处输入图片说明

我将需要查询带回此:

在此处输入图片说明

干杯,迈克

SQL小提琴

Oracle 11g R2架构设置

CREATE TABLE Data ( Cell, Date_Time, COOS, Unavailability ) AS
          SELECT 'D02463', DATE '2015-11-16' + INTERVAL '10' HOUR, 1, 0 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '9' HOUR, 0, 3600 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '8' HOUR, 0, 3600 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '7' HOUR, 0, 3600 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '6' HOUR, 0, 3600 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '5' HOUR, 1, 0 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '4' HOUR, 1, 0 FROM DUAL
UNION ALL SELECT 'D02463', DATE '2015-11-16' + INTERVAL '3' HOUR, 1, 0 FROM DUAL

查询1

SELECT Cell,
       Cell_Down,
       Cell_Up,
       (Cell_Up - Cell_Down)*24 AS Time_Down
FROM   (
  SELECT Cell,
         Date_Time AS Cell_Up,
         LAG( Date_Time ) OVER ( PARTITION BY Cell ORDER BY Date_Time ) + INTERVAL '1' HOUR AS Cell_Down
  FROM   Data
  WHERE  COOS = 1
)
WHERE Cell_Down < Cell_Up

结果

|   CELL |                  CELL_DOWN |                    CELL_UP | TIME_DOWN |
|--------|----------------------------|----------------------------|-----------|
| D02463 | November, 16 2015 06:00:00 | November, 16 2015 10:00:00 |         4 |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM