无法弄清楚PostgreSQL的确切查询

时间:2016-11-04 16:57:18

标签: sql postgresql

我有一组postgreSQL数据,看起来像附图中的那个(Pic1-样本数据):

Pic 1-Sample Data

custom_field列会识别行条目是“部门ID”还是“高优先级角色?”而text_value列的前六位数将给出部门代码。 正如您所看到的那样,只要custom_field是“高优先级角色?”,text_value列中的值为“是” 现在我的要求是仅提取custom_field为“高优先级角色”的记录。这听起来很简单,但它也应该附加“部门ID”。

注意:job_id不是唯一的。每个job_id对应“高优先级角色?”也会有一个重复的条目,其中custom_field中的值将是“部门ID”(参见附件2中的参考)。

Pic 2

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,但它应该可以工作。

http://sqlfiddle.com/#!15/62ca4/3/0

答案 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;