Проверьте строки на монотонно увеличивающиеся значения - PullRequest
0 голосов
/ 30 апреля 2018

Я ищу способ проверить, монотонно ли увеличиваются значения в таблице для определенного подмножества строк. Таблица содержит столбцы id, name, measure_date и value. Для всех строк с одинаковым именем строки должны быть отсортированы по measure_date, и необходимо проверить, монотонно ли увеличивается столбец значений для этих отсортированных строк. Как результат, мне нужен идентификатор и флаг, который равен 1, если строка с идентификатором нарушает моноту, 0 в противном случае. Пример данных может быть:

id   name   meas_date   value
1    name1  2018/01/01  1
2    name1  2018/01/02  2
3    name2  2018/01/04  2
4    name1  2018/01/03  1
5    name1  2018/01/04  5
6    name2  2018/01/05  4
7    name2  2018/01/06  2
8    name1  2018/01/05  2

Желаемый результат:

id    flag
1     0
2     0
3     0
4     1
5     0
6     0
7     1
8     1

Если возможно, результат вычисляется без PL / SQL, только чистый SQL.

Я думаю, что мне нужно какое-то внутреннее объединение таблицы с самим собой, объединяясь по множеству отсортированных подмножеств, где каждое подмножество представляет одно возможное значение столбца имени. В объединенной таблице мне нужно вычислить разницу между столбцами значений каждой строки с ее предшественником, и если разница равна нулю или ниже, это должно привести к значению флага = 1.

Я использую Oracle 11g.

Большое спасибо,

Christian

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать аналитическую функцию для достижения этой цели.

Вот краткий пример:

SELECT id,
       name,
       meas_date,
       value,
       CASE WHEN value > value_prev THEN 0 ELSE 1 END AS flag
  FROM(SELECT id,
              name,
              meas_date,
              value,
              LAG(value, 1, 0) OVER (PARTITION BY name ORDER BY meas_date ) AS value_prev
         FROM your_table
      )

Я не проверяю это, но надеюсь, что это поможет.

0 голосов
/ 30 апреля 2018

Если ваша версия Oracle поддерживает LAG, то есть простой вариант:

SELECT
    id,
    CASE WHEN value >= LAG(value, 1, value) OVER (PARTITON BY name ORDER BY meas_date)
         THEN 0 ELSE 1 END AS flag
FROM yourTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...