Найти количество последовательных похожих значений в столбце - Oracle - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть таблица, которая получает устаревшие (аналогичные) значения через определенный промежуток времени.Я хочу найти количество последних последовательных значений.Можете ли вы помочь мне написать запрос Oracle SQL для этого?Я напечатал образец ввода и вывода ниже.

Вход:

ID   date         value
2641 02/01/2019    5.6
2641 02/04/2019    5.7
2641 02/05/2019    6.2
2641 02/06/2019    6.2
2641 02/07/2019    4.3 
2641 02/08/2019    4.3
2641 02/11/2019    4.3
2641 02/12/2019    4.3
2641 02/13/2019    4.3
2641 02/14/2019    4.3
2641 02/15/2019    4.3
2641 02/18/2019    4.3
2641 02/19/2019    4.3
2642 02/01/2019    7.6
2642 02/04/2019    4.7
2642 02/05/2019    5.2
2642 02/06/2019    3.8
2642 02/07/2019    3.8
2642 02/08/2019    3.8
2642 02/11/2019    3.8
2642 02/12/2019    3.8
2642 02/13/2019    3.8
2642 02/14/2019    3.8
2642 02/15/2019    3.8
2642 02/18/2019    3.8
2642 02/19/2019    3.8

Выход

ID   stale_days
2641  9  
2642  10

С уважением, Саван

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я бы так и сделал.

Идея состоит в том, чтобы каждая строка получала максимальное значение всех строк, следующих после, и минимальное значение всех строк, следующих после.Если значение совпадает с минимальным и максимальным, вы их подсчитываете.

SELECT ID, COUNT(*) FROM (
  SELECT 
    ID, 
    VALUE,
    MIN(VALUE) OVER ( PARTITION BY ID ORDER BY D ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS MIN_NEXT,
    MAX(VALUE) OVER ( PARTITION BY ID ORDER BY D ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS MAX_NEXT
  FROM T
) WHERE VALUE=MIN_NEXT AND VALUE=MAX_NEXT
GROUP BY ID;

Для теста: http://sqlfiddle.com/#!4/046b1/1

0 голосов
/ 26 февраля 2019
    with rows_with_cons_val as
    (
    select t.*, rowid, row_number() over (partition by id, value order by date_entered) 
    rid 
    from t) 
    select id, rid as stale_days
    from (
    select r.*, max(date_entered) over (partition by id) as selection
    from rows_with_cons_val r) where date_entered = selection;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...