【问题标题】:Postgres Query to Combine multiple Rows into one based on Status ConditionPostgres查询根据状态条件将多行合并为一
【发布时间】:2020-12-04 02:52:29
【问题描述】:

我有以下数据的示例

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

我期待的输出是

Col1 Status
a    Failed

即任何一个子作业(Col2)都失败了,那么主作业应该显示为失败

【问题讨论】:

  • 如果没有失败的作业,你想看什么?例如b ab Completed 是否还有另一行?
  • select col1, status from the_table where status = 'Failed' 不做你想做的事吗?
  • @a_horse_with_no_name, 'a' 是主作业,'Col2' 中的数据是'a' 的子作业。所以表中的状态是针对子作业的。这意味着如果任何子作业失败,则应将主作业(Col1)设置为“失败”如果您有另一行 b ab,则“b”将成为另一个主作业
  • 再说一遍:select col1, status from the_table where status = 'Failed' 会返回你想要的结果,而你还没有回答这个问题,如果你的主作业没有失败的子作业,你想要什么结果
  • @a_horse_with_no_name 如果所有子作业都已成功完成,那么如果不是“未完成”,则主作业应显示为“成功”

标签: sql string postgresql greatest-n-per-group


【解决方案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

【讨论】:

  • 感谢您的回复。它有效但不完全。因为它按状态排序并根据设置的优先级显示它们。但是如果任何子作业(Col2)处于“运行”或“失败”状态,我想将主作业(Col1)的状态设置为“未完成”。例如:如果子作业只有“正在运行”状态,则返回的最终状态将设置为“正在运行”而不是“未完成”
  • @ADT 您评论中的所有信息都应该包含在您的原始问题中。此解决方案解决了您的问题。
【解决方案2】:

我认为对您提出的问题的最简单答案是:

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

这将返回所有失败的col1s。

如果您有不同的问题,那么您应该将其作为一个新的问题提出。清楚地解释您的逻辑,并提供涵盖您需要沟通的主要场景的示例数据和预期结果。

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2017-11-28
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2022-01-13
    • 2021-05-02
    • 2021-11-21
    • 2021-03-23
    相关资源
    最近更新 更多