PostgreSQL-是否可以查询多行以确定单个定义的值?

先知

使用如下数据集-是否可以查询多个列以确定预定义值?

例如,查询数据将根据每个状态返回“ Complete”或“ Pending”状态eventId,即,如果所有eventIdstatus =“ Approved”-事件的状态为“ Complete”。否则,事件的状态将为“待处理”。

eventId=1具有三个状态-草稿,草稿,已提交-状态=待处理。
eventId=2具有两个状态-已批准,已批准-状态=完成。
eventId=3具有一个状态-已提交-状态=待处理。
eventId=4具有两个状态-草稿,草稿-状态=待处理。

| activityId    | eventId       | status    |
| ------------- | ------------- | -----     |
| 1             | 1             | Draft     |
| 2             | 1             | Draft     |
| 3             | 1             | Submitted |
| 4             | 2             | Approved  |
| 5             | 2             | Approved  |
| 6             | 3             | Submitted |
| 7             | 4             | Draft     |
| 8             | 4             | Draft     |
克林

对于每个事件,您可以对状态为“已批准”的行进行计数,并将其与所有行的数量进行比较:

select 
    eventid, 
    string_agg(status, ', ') as statuses, 
    case when count(*) = count(case status when 'Approved' then 1 end) 
        then 'Complete'
        else 'Pending' end as event_status
from my_table
group by 1
order by 1

 eventid |        statuses         | event_status 
---------+-------------------------+--------------
       1 | Draft, Draft, Submitted | Pending
       2 | Approved, Approved      | Complete
       3 | Submitted               | Pending
       4 | Draft, Draft            | Pending
(4 rows)    

当然,如果不需要,您可以删除第二列。

布尔聚合的更优雅的版本

select 
    eventid, 
    string_agg(status, ', ') statuses, 
    case when bool_and(status = 'Approved')
        then 'Complete'
        else 'Pending' end as event_status
from my_table
group by 1
order by 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章