我有一张像这样的table
+-----------+-----------+---------------------+
| Report_id | Status | Date |
+-----------+-----------+---------------------+
| 1 | Completed | 2020-06-07 12:20:00 |
| 1 | Completed | 2020-06-07 12:22:00 |
| 2 | Running | 2020-06-07 13:02:00 |
| 2 | Completed | 2020-06-07 13:10:00 |
| 3 | Completed | 2020-06-07 14:10:00 |
| 3 | Failed | 2020-06-07 14:04:00 |
+-----------+-----------+---------------------+
我需要按报表id将此数据分组。因此,如果组中的所有状态值都等于completed,则status is completed和date是组中的最大值。但如果组中有一个running或failed值,则status需要分别等于running和failed,date应该与此值匹配。
输出将如下所示。
+-----------+-----------+---------------------+
| Report_id | Status | Date |
+-----------+-----------+---------------------+
| 1 | Completed | 2020-06-07 12:22:00 |
| 2 | Running | 2020-06-07 13:02:00 |
| 3 | Failed | 2020-06-07 14:04:00 |
+-----------+-----------+---------------------+
我怀疑我需要在某个地方使用case语句来获得这个输出,但我不知道怎么做。请帮忙。
5条答案
按热度按时间rryofs0p1#
您可以使用string\u agg将状态列的文本组合成一个字符串,并检查该字符串是否包含“running”或“failed”
z0qdvdin2#
查看您的样本,您似乎需要每个报告的初始状态(基于日期)
ykejflvf3#
你可以试着用
row_number()
```select * from
(
select report_id,status,date, row_number() over(partition by report_id order by
case when status in ('Running','Failed') then 1 else 2 end asc,Date desc) as rn
from tablename
)A where rn=1
jei2mxaa4#
不确定这是否是你要找的,也不知道这是否是完全运行。
mlnl4t2r5#
你可以用
distinct on
: