我有一组postgreSQL数据,看起来像附图中的那个(Pic1-样本数据):
custom_field列会识别行条目是“部门ID”还是“高优先级角色?”而text_value列的前六位数将给出部门代码。 正如您所看到的那样,只要custom_field是“高优先级角色?”,text_value列中的值为“是” 现在我的要求是仅提取custom_field为“高优先级角色”的记录。这听起来很简单,但它也应该附加“部门ID”。
注意:job_id不是唯一的。每个job_id对应“高优先级角色?”也会有一个重复的条目,其中custom_field中的值将是“部门ID”(参见附件2中的参考)。
答案 0 :(得分:0)
这样的东西?
select
a.*,
b.display_value as department
from (
select
*
from
<table>
where
custom_field = 'High Priority Role?'
) a
inner join
<table> b
on
a.job_id = b.job_id
where
b.custom_field != 'High Priority Role?'
group by
a.job_id,
a.custom_field,
a.float_value,
a.date_value,
a.display_value,
a.text_value,
a.unit,
b.display_value
我已经在MariaDB中测试过,而不是PostgreSQL,但它应该可以工作。
答案 1 :(得分:0)
这是一个简单的join
:
select t.*, left(t2.text_value, 6) as department_id
from t join
t t2
on t.job_id = t2.job_id and
t.custom_field = 'High Priority Role?' and
t2.custom_field <> 'High Priority Role?';
这假设只有一个匹配的作业具有部门ID。
如果有多个,则进行横向连接:
select t.*, left(t2.text_value, 6) as department_id
from t, lateral
(select t2.*
from t t2
where t.job_id = t2.job_id and
t.custom_field = 'High Priority Role?' and
t2.custom_field <> 'High Priority Role?'
fetch first 1 row only -- no `order by` because any match will do
) t2;