Использование условий для возврата определенных строк - PullRequest
0 голосов
/ 04 февраля 2019

Из следующей таблицы я пытаюсь получить определенные строки на основе критериев

+----+--------------+------+
| ID | UPDATED_DATE | TYPE |
+----+--------------+------+
|  1 | 01/13        | P    |
|  1 | 02/13        | P    |
|  1 | 03/13        | P    |
|  2 | 01/14        | P    |
|  2 | 02/14        | W    |
|  2 | 03/14        | P    |
|  2 | 04/14        | W    |
|  2 | 05/14        | P    |
|  2 | 06/14        | P    |    
+----+--------------+------+

Expected rows:
+----+--------------+------+
| ID | UPDATED_DATE | TYPe |
+----+--------------+------+
|  1 | 01/13        | P    |
|  2 | 05/14        | P    |
+----+--------------+------+

Критерии:

Если тип "W" существует в любой из строк дляидентификатор затем получить следующее вхождение «P» после «W».Если нет, получите первое вхождение 'P'.Если для каждого идентификатора есть две буквы «W», то после последней буквы «W»

получите «P». Мне удалось получить необходимую строку, если я передал ID.Но я хочу запустить это для всей таблицы и получить необходимые строки.

SELECT
CASE
    WHEN (
        SELECT
            MAX(UPDATED_DATE)
        FROM
            TABLE_NAME
        WHERE
            ID = '1'
            AND TYPE = 'W'
    ) IS NULL THEN
        (
            SELECT
                MIN(UPDATED_DATE)
            FROM
                TABLE_NAME
            WHERE
                ID = '1'
        )
    ELSE
        (
            SELECT
                MIN(UPDATED_DATE)
            FROM
                TABLE_NAME
            WHERE
                ID = '1'
                AND UPDATED_DATE > (
                    SELECT
                        MAX(UPDATED_DATE)
                    FROM
                        TABLE_NAME
                    WHERE
                        ID = '1'
                        AND TYPE = 'W'
                )
        )
END
FROM
   dual;

1 Ответ

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

Вы можете использовать оконные функции:

with wp as (
      select t.*,
             lag(id) over (partition by id order by updated_date) as prev_id,
             min(case when type = 'W' then id ) over (partition by id) as min_w_id,
             row_number() over (partition by id order by updated_date) as seqnum
      from t
      where type in ('W', 'P')
     )
select
from wp
where (min_w_id is null = 0 and seqnum = 1) or
      (prev_id = min_w_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...