#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
строки, которые завершились ошибкой.
Если у вас другой вопрос, то вам следует задать его как новый вопрос. Четко объясните свою логику и предоставьте примеры данных и желаемых результатов, которые охватывают основные сценарии, которые вам необходимо сообщить.