SELECT CASE с повторным запросом повторяет более одной строки - PullRequest
1 голос
/ 04 октября 2019

Когда я выполняю код для partition_date = 2019-12-11 и для partition_date = 2019-07-06, я получаю сообщение об ошибке: « Подзапрос повторяет более одной строки ». В других случаях это работает

select case when my_count <=1 AND status_  = 'END' then 0 
                    when my_count >1 AND status_ IN ('END', 'RUNNING', 'START', 'ERR') THEN 1              
                    ELSE -1
               end  AS W 
        INTO return_val
        from (select 
          (SELECT count(DISTINCT(status)) FROM my_table 
          WHERE my_table.HIVE = 'hive1' 
          AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
          AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
        ) my_count,
          (SELECT DISTINCT(status) AS status_ FROM my_table 
          my_table.HIVE = 'hive1' 
          AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
          AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
        )status_
          FROM dual 
            )x  ;
           RETURN(return_val);

my_table похож на

    STATUS |HIVE |PARTITION_DATE     |
    -------|-----|-------------------
    END    |hive1|2019-12-11 00:00:00|
    START  |hive1|2019-12-12 00:00:00|
    NA     |hive1|2019-12-13 00:00:00|
    END    |hive1|2019-09-12 00:00:00|
    END    |hive1|2019-09-13 00:00:00|
    END    |hive1|2019-09-14 00:00:00|
    ERR    |hive1|2019-08-06 00:00:00|
    ERR    |hive1|2019-07-06 00:00:00|
    START  |hive1|2019-07-07 00:00:00|
    RUNNING|hive1|2019-07-08 00:00:00|
    END    |hive1|2019-07-09 00:00:00|

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Почему вы не используете group by,

ВЫБРАТЬ случай, когда my_count <= 1 AND status_ = 'END', а затем 0, когда my_count> 1 AND status_ IN ('END', 'RUNNING', 'START ',' ERR ') THEN 1
ELSE -1 заканчивается AS W IN return_val из (выберите DISTINCT count (status) в качестве my_count, status в качестве status_ FROM my_table WHERE EL_F_BDP_PROC_REALTIME.HIVE =' hive1 'И ВЫПИСКА (MONTH FROM PARTITION_DATE)) = EXTRACT (МЕСЯЦ ОТ TO_DATE ('20191212', 'YYYY-MM-DD'))) И EXTRACT (ГОД ОТ PARTITION_DATE) = EXTRACT (ГОД ОТ TO_DATE ('20191212', 'YYYY-MM-DD')) постатус) res;

0 голосов
/ 04 октября 2019

У вас есть несколько состояний в операторе:

(SELECT DISTINCT(status) AS status_ FROM my_table 
          WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' 
          AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
          AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
        )

и возвращено более одной строки.

Для выполнения Rigth вам необходимо вернуть один пример значения:

max((SELECT DISTINCT(status) AS status_ FROM my_table 
              WHERE EL_F_BDP_PROC_REALTIME.HIVE = 'hive1' 
              AND EXTRACT(MONTH FROM PARTITION_DATE) = EXTRACT(MONTH FROM TO_DATE('20191212', 'YYYY-MM-DD'))
              AND EXTRACT(YEAR FROM PARTITION_DATE) = EXTRACT(YEAR FROM TO_DATE('20191212', 'YYYY-MM-DD'))
            ))

Это выполняется, но, возможно, логика неверна

Попробуйте:

with tbl as (
select 'START' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') dt from dual 
union all
select 'NA' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') from dual 
union all
select 'END' status,     'hive1' str, to_date('2019-12-11', 'yyyy-mm-dd') from dual)
select dt, str, listagg(status, ' ') WITHIN GROUP (ORDER BY str) 
from tbl
GROUP BY dt, str
...