Загрузка данных


select
    c.number as contract_number,
    count(*) as contract_count,
    count(distinct c.individual_id) as individual_count
from ourpension.contract c
where c.individual_id is not null
group by c.number
having count(distinct c.individual_id) > 1
order by individual_count desc, c.number;



select
    c.number as contract_number,
    lower(btrim(i.last_name)) as last_name,
    count(distinct c.individual_id) as individual_count,
    string_agg(
        distinct concat_ws(
            ' ',
            i.last_name,
            i.first_name,
            i.middle_name,
            '(individual_id=' || c.individual_id || ')'
        ),
        '; '
    ) as persons
from ourpension.contract c
join ourpension.individual i
    on i.id = c.individual_id
where c.individual_id is not null
group by
    c.number,
    lower(btrim(i.last_name))
having count(distinct c.individual_id) > 1
order by c.number, last_name;



select
    c.number as contract_number,
    lower(btrim(i.last_name)) as last_name,
    lower(btrim(i.first_name)) as first_name,
    count(distinct c.individual_id) as individual_count,
    string_agg(
        distinct concat_ws(
            ' ',
            i.last_name,
            i.first_name,
            i.middle_name,
            '(individual_id=' || c.individual_id || ')'
        ),
        '; '
    ) as persons
from ourpension.contract c
join ourpension.individual i
    on i.id = c.individual_id
where c.individual_id is not null
group by
    c.number,
    lower(btrim(i.last_name)),
    lower(btrim(i.first_name))
having count(distinct c.individual_id) > 1
order by c.number, last_name, first_name;



join ourpension.individual i
    on i.id = c.individual_id
   and lower(btrim(i.last_name)) = lower(btrim(l.person_last_name))
   and lower(btrim(i.first_name)) = lower(btrim(l.person_first_name))