2015-11-16 58 views
0

我,我一直在试图理清一个小问题...甲骨文 - 带回前一行基于价值和下一行

显示数据库可用性的记录为特定的细胞。如果单元格它记录为0不可用,当单元格关闭时,它显示为3600(秒)。当某个记录在其中一个字段中有3600个字符时,则1将被放置在另一个字段中以将其显示为服务单元(COOS)。

我已经能够搜索记录,以显示所有当前COOS,但我需要能够做的是搜索和显示当一个细胞去了,当它回来了......

,所以我需要在数据库中搜索'3600'的第一个实例,然后返回显示'0'的前一条记录,然后再次返回显示'0'的下一条记录,然后告诉我该单元格停止的日期/时间。

这是数据的一个例子:

enter image description here

我需要查询带来带回这样的:

enter image description here

干杯, 迈克

+0

谢谢jarlh,我不是肯定的怎么加图像li那个! – Mikey

回答

0

SQL Fiddle

的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 

Results

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