Запрос Postgres для объединения нескольких строк в одну на основе состояния

#sql #string #postgresql #greatest-n-per-group

#sql #строка #postgresql #наибольшее число строк на группу

Вопрос:

У меня есть пример приведенных ниже данных

 Col1 Col2 Status
a    ab   Failed
a    bc   Running
a    cd   Completed
  

Результат, который я ожидаю, это

 Col1 Status
a    Failed
  

т. е. любое одно вложенное задание (Col2) выполнено с ошибкой, тогда основное задание должно отображаться как выполненное с ошибкой

Комментарии:

1. Что вы хотите увидеть, если вообще нет неудачного задания? например, если была другая строка с b ab Completed ?

2. Не select col1, status from the_table where status = 'Failed' делает то, что вы хотите?

3. @a_horse_with_no_name, ‘a’ — это основное задание, а данные в ‘Col2’ являются вспомогательными заданиями ‘a’. Таким образом, статус в таблице относится к вспомогательным заданиям. Это означает, что если какое-либо дополнительное задание завершилось неудачей, то основное задание (Col1) должно быть установлено как ‘Failed’ Если у вас есть другая строка b ab, то ‘b’ становится другим основным заданием

4. Опять же: желаемый результат будет возвращен select col1, status from the_table where status = 'Failed' , и вы не ответили на вопрос, какой результат вы хотите, если у вас есть основное задание, в котором нет неудачных подзадач

5. @a_horse_with_no_name если все вспомогательные задания выполнены успешно, то основное задание должно отображаться как ‘Successed’, если нет ‘NotCompleted’

Ответ №1:

Один из вариантов использует distinct on и условную сортировку:

 select distinct on (col1) col1, status
from mytable
order by 
    col1,
    case status
       when 'Failed'    then 0
       when 'Running'   then 1
       when 'Completed' then 2
    end
  

При этом приоритет отдается статусу «Сбой», за которым следует «Выполняется», затем «Завершено».

Вы также могли бы использовать логические значения для упорядочивания, например:

 order by 
    col1,
    (status = 'Failed')    desc,
    (status = 'Running')   desc,
    (status = 'Completed') desc
  

Комментарии:

1. Спасибо за ваш ответ. это сработало, но не полностью. поскольку он упорядочивает по статусу и отображает их в соответствии с установленным приоритетом. Но я хотел бы установить статус основного задания (Col1) как ‘Незавершенное’, если какое-либо из вспомогательных заданий (Col2) находится в состоянии ‘Выполняется’ или ‘Сбой’. Например: Если подзадача имеет статус только «Выполняется», то возвращаемый окончательный статус будет установлен на «Выполняется», а не как «Не завершено»

2. @ADT Вся информация в вашем комментарии должна была быть включена в ваш исходный вопрос. Это решение отвечает тому, что вы просили.

Ответ №2:

Я думаю, что самый простой ответ на вопрос, который вы задали, это:

 select distinct col1, status
from t
where status = 'Failed';
  

Это вернет все col1 строки, которые завершились ошибкой.

Если у вас другой вопрос, то вам следует задать его как новый вопрос. Четко объясните свою логику и предоставьте примеры данных и желаемых результатов, которые охватывают основные сценарии, которые вам необходимо сообщить.