我正在尝试修改一个查询,以添加一个值必须为"fail“的列,如果另一个表中具有相同id的任何值在某个列中都为"fail”。
有3个表,表1包含4行(类别)的财务数据(固定收益、股票、评级、列表)及其systemId。
表2包含1000多行财务数据,这些数据可能属于这4个类别中的任何一个。表2还具有名为STATUS的行,该行可能包含值:"running“、"fail”或"standby“。
表3包含关于数据集的一般信息,并且具有id和systemId的值。
我想添加一个名为STATE的列到TABLE1(categories),如果具有相同systemId的任何行包含值"fail“或"standby”,则该列包含"fail“或"standy”,并且仅当具有相同systemId (table2)的所有行在其状态列(table2)中具有"running“时才显示"running”。
表1
category systemId ???STATE???
fixed income 1 ?
listings 2 ?
ratings 3 ?
equities 4 ?
表2
ID STATUS
45421158 failed
2121158 running
9464548888 running
454548888 standby
9948158 running
78748158 running
TABLE3
id **systemId**
45421158 1
98721158 1
454548888 2
6888888 2
78748158 3
9978158 3
我尝试了这么多不同的连接和子查询,但都没有成功。我是一个UI开发人员,没有访问数据库,只有通过缓存运行在java上的样本,所以我不能添加新的表或任何类似的东西,它必须是1个查询,所以我可以修改资源。
提前感谢您,您将合法地拯救我的生命!
发布于 2019-06-23 21:53:25
我不太清楚表中的列是什么。但是对于您想要的逻辑,一种方法是使用CASE
和EXISTS
。
查询看起来像这样,尽管我不确定相关条件是什么(也就是说,哪些条件与两个表中的行匹配):
select c.*,
(case when exists (select 1
from servicemetric.servicemetric m
where m.category = c.category and
m.status = 'fail'
then 'fail'
when exists (select 1
from servicemetric.servicemetric m
where m.category = c.category and
m.status = 'standby'
then 'standby'
else 'running'
end) as imputed_status
from node.categories c;
您还可以使用条件聚合来实现逻辑:
select m.category,
(case when sum(case when m.status = 'fail' then 1 else 0 end) > 0 then 'fail'
when sum(case when m.status = 'standby' then 1 else 0 end) > 0 then 'standby'
else 'running'
end) as status
from servicemetric.servicemetric m
group by m.category;
或者甚至使用coalesce()
select m.category,
coalesce(max(case when m.status = 'fail' then status end),
max(case when m.status = 'standby' then status end),
max(m.status)
)
from servicemetric.servicemetric m
group by m.category;
发布于 2019-06-24 00:30:24
您必须将3个表、group by
类别和系统and连接起来:
select
t1.category,
t1.systemid,
case
when sum(case when t2.status = 'failed' then 1 else 0 end) > 0 then 'failed'
when sum(case when t2.status = 'standby' then 1 else 0 end) > 0 then 'standby'
when sum(case when t2.status = 'running' then 1 else 0 end) > 0 then 'running'
end status
from table1 t1
left join table3 t3 on t3.systemid = t1.systemid
left join table2 t2 on t2.id = t3.id
group by t1.category, t1.systemid
我使用了left
连接,以防table3
中缺少系统I。如果不是这样,请更改为inner
joins
https://stackoverflow.com/questions/56724505
复制相似问题