объединить набор статусов строк в единый сводный статус - PullRequest
2 голосов
/ 17 мая 2011

У меня есть представление, которое выглядит так:

package_id  package_line  status_a        status_b
1           1             NOT_STARTED     FAILED
1           2             STARTED         STARTED
1           3             FAILED          NOT_STARTED
2           1             COMPLETE        STARTED
2           2             COMPLETE        NOT_STARTED

и так далее, для нескольких тысяч строк.Status_a и status_b - это отдельные несвязанные статусы (на самом деле они представляют собой, выполняется ли пакет в системе a и в системе b).

Мне нужна сводка по package_id, чтобы получить значение

   package_id status_a  status_b
   1          FAILED    FAILED
   2          COMPLETE  NOT_STARTED

Правила объединения строк пакета:

 1. If any package line has failed, the package has failed.
 2. If all package lines are complete, the package is complete.
 3. If all package lines are NOT_STARTED, the package has not started.
 4. Otherwise, the package is started (i.e. a combination of started, not_started, and complete would summarize as STARTED).

Поэтому я пытаюсь найти запрос для создания этого резюме.Я хотел бы опубликовать пример кода, но я действительно в растерянности.Предположительно я хочу GROUP_BY package_id, но что я могу использовать в качестве агрегатной функции, которая позволила бы мне применять перечисленные правила?

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

1 Ответ

4 голосов
/ 17 мая 2011

Попробуйте это (то же самое для status_b):

SELECT package_id,
       CASE WHEN FAILED_COUNT > 0 THEN 'FAILED'
            WHEN COMPLETE_COUNT = ALL_COUNT THEN 'COMPLETE'
            WHEN NOT_STARTED_COUNT = ALL_COUNT THEN 'NOT_STARTED'
            ELSE 'STARTED'
       END status_a
FROM (            
SELECT package_id,
     COUNT(status_a) ALL_COUNT,
     SUM(CASE WHEN status_a = 'FAILED' THEN 1 ELSE 0 END) FAILED_COUNT,
     SUM(CASE WHEN status_a = 'COMPLETE' THEN 1 ELSE 0 END) COMPLETE_COUNT,
     SUM(CASE WHEN status_a = 'NOT_STARTED' THEN 1 ELSE 0 END) NOT_STARTED_COUNT,
     SUM(CASE WHEN status_a = 'STARTED' THEN 1 ELSE 0 END) STARTED_COUNT
 FROM table
GROUP BY package_id
)
...