Oracle SQL - выберите последние 3 строки после определенной строки - PullRequest
0 голосов
/ 07 ноября 2019

Ниже приведены мои данные:

enter image description here

Мое требование - получить первые 3 последовательных утверждения. Итак, данные выше, ID 4, 5 и 6 - это строки, которые мне нужно выбрать. ID 1 и 2 не имеют права, потому что ID 3 является отклонением и, следовательно, нарушает последовательное условие действий. По сути, я ищу последнее отклонение в списке, а затем нахожу 3 последовательных утверждения после этого.

Кроме того, если в цепочке действий нет отклонений, то первые 3 действия должны быть результатом. Для следующих данных:

enter image description here

Таким образом, мои выходные данные должны быть ID 11, 12 и 13.

И если их меньше 3утверждений, то на выходе должен быть список утверждений. Для следующих данных:

enter image description here

выходные данные должны быть ID 21 и 22.

Есть ли способ достичь этого только с помощью SQL-запроса- т.е. нет кода PL-SQL?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Вот один метод, который использует оконные функции:

  • Найти первую строку, где есть три утверждения.
  • Найти минимальный action_at среди строк с тремя утверждениями
  • Фильтр
  • Оставьте нужные вам три строки

В этой версии используется fetch из Oracle 12 +:

select t.*
from (select t.*,
             min(case when has_approval_3 = 3 then action_at end) over () as first_action_at
      from (select t.*,
                   sum(case when action = 'APPROVAL' then 1 else 0 end) over (order by action_at rows between current row and 2 following) as has_approval_3
            from t
           ) t
     ) t
where action = 'APPROVAL' and
      (action_at >= first_action_at or first_action_at is null)
order by action_at
fetch first 3 rows only;
1 голос
/ 07 ноября 2019

Вы можете использовать аналитические функции IN и ROW_NUMBER следующим образом:

SELECT * FROM
    (  SELECT
            T.*,
            ROW_NUMBER() OVER(ORDER BY Y.ACTION_AT) AS RN
        FROM YOUR_TABLE Y
        WHERE Y.ACTION = 'APPROVE'
          AND Y.ACTION_AT >= COALESCE(
               (SELECT MAX(YIN.ACTION_AT)
                FROM YOUR_TABLE YIN
                WHERE YIN.ACTION = 'REJECT'
               ), Y.ACTION_AT) )
WHERE RN <= 3;

Cheers !!

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