Как получить данные, используя временную метку, если между временной меткой есть разрыв, а затем количество записей разрывов, которые будут отображаться в строке в Oracle - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть небольшое требование для решения.

У нас есть данные, каждые полчаса записи которых начинаются с 27-09-2018 00: 00: 00 с начала дня.

Meter_id |Realtimeclock      |I_Y|I_B|I_X|
201010   |27-09-2018 00:00:00|1.0|2.0|3.0|
201010   |27-09-2018 00:30:00|1.0|2.0|3.0|
201010   |27-09-2018 01:00:00|1.0|2.0|3.0|
201010   |27-09-2018 01:30:00|1.0|2.0|3.0|
201010   |27-09-2018 02:00:00|1.0| 0 |3.0|
201010   |27-09-2018 02:30:00|1.0| 0 |0  |
201010   |27-09-2018 03:00:00|1.0|2.0|3.0|
201010   |27-09-2018 03:30:00|1.0|2.0|3.0|

Из приведенной выше таблицы мы должны получить данные от 27-09-2018 00:00:00 часов реального времени до 27-09-2018 01:30:00 часов реального времени в виде одной записи счетчика и посмотреть, какое значение имело место0 в I_B и I_X в обеих временных метках 27-09-2018 02:00:00 и 27-09-2018 02:30:00, поэтому здесь мы можем пропустить эти две записи и продолжить с оставшимися данными, которые начинаются с 27-09-2018 03:00:00 часов реального времени и заканчивается 27-09-2018 03:30:00, и это должно быть представлено как другая запись со счетом.

как здесь, вывод должен быть,

Meter_id |start_time         |End_time           |I_Y|I_B|I_X|
201010   |27-09-2018 00:00:00|27-09-2018 01:30:00|4  |4  |4  |
201010   |27-09-2018 03:00:00|27-09-2018 03:30:00|2  |2  |2  |

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Я думаю, что либо вам нужно написать хранимую процедуру, которая будет запускать цикл с указанными условиями и получать записи, что-то похожее на это:

Строка для каждого часа, даже если нет записи[duplicate]

или вы выполняете запрос каждые 1 час или в любой другой интервал времени, который вам нужен, передавая все обновленные данные и получая результат, в этом случае запрос может выглядеть примерно так:

select * from table_name, где в реальном времени между start_datetime и end_datetime и I_B! = 0 и I_X! = 0;

Будет возвращено пустое множество, если какое-либо условие неверно.

0 голосов
/ 27 сентября 2018

Это проблема пробелов и островков.В одном подходе используется метод разности номеров строк:

WITH cte1 AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY Meter_id ORDER BY Realtimeclock) rn
    FROM yourTable t
),
cte2 AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY Meter_id ORDER BY Realtimeclock) rn
    FROM yourTable t
    WHERE I_B <> 0
),
cte3 AS (
    SELECT t1.*,
        t1.rn - t2.rn AS diff
    FROM cte1 t1
    INNER JOIN cte2 t2
        ON t1.Meter_id = t2.Meter_id AND t1.Realtimeclock = t2.Realtimeclock
)

SELECT
    Meter_id,
    MIN(Realtimeclock) AS start_time,
    MAX(Realtimeclock) AS end_time,
    COUNT(I_Y) AS I_Y,
    COUNT(I_B) AS I_B,
    COUNT(I_X) AS I_X
FROM cte3
GROUP BY
    Meter_id,
    diff;

enter image description here

Демо

Примечание. Демонстрация выполняется на SQL Server, но код также должен работать на Oracle без изменений.Иногда я борюсь с синтаксисом Oracle при настройке демонстраций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...