Как убрать дубликаты в select?

with
active_campaigns_with_settings as (
    select
        *
    from campaigns as c
    join campaigns_settings as cs on c.id = cs.campaign_id
    where
        date_part('hour', now()) between cs.worktime_from and cs.worktime_to and
        c.is_active=true
),

active_campaigns_with_messages as (
    select
        acws.id as campaign_id,
        acws.unique_days,
        c2.id as phone_id,
        c2.phone,
        c2.created_at as contact_created_at,
        t.url,
        t.text
    from active_campaigns_with_settings as acws

    join templates as t on t.campaign_id = acws.id
    join contacts c2 on acws.id = c2.campaign_id

    where c2.aggregated = false and c2.is_valid = false
),

prefinal as (
    select
        acwm.campaign_id,
        acwm.unique_days,
        acwm.phone,
        acwm.phone_id,
        acwm.text,
        acwm.url,
        (acwm.contact_created_at::date-tm.send_at::date) as cntday
    from active_campaigns_with_messages as acwm

    left join templates_messages tm on
        acwm.phone = tm.phone and acwm.campaign_id = tm.campaign_id and
        tm.send_at >= now() - make_interval(days => acwm.unique_days)
),

final as (
    select * from prefinal as pf where cntday > pf.unique_days or cntday is null
)
        
select * from final

введите сюда описание изображения

Здравствуйте, есть такой запрос Как убрать повторяющиеся номера телефона из ответа?


Ответы (1 шт):

Автор решения: Мягков А.С РК4-12
with
active_campaigns_with_settings as (
    select
        *
    from campaigns as c
    join campaigns_settings as cs on c.id = cs.campaign_id
    where
        date_part('hour', now()) between cs.worktime_from and cs.worktime_to and
        c.is_active=true
),

active_campaigns_with_messages as (
    select
        acws.id as campaign_id,
        acws.unique_days,
        c2.id as phone_id,
        c2.phone,
        c2.created_at as contact_created_at,
        t.url,
        t.text
    from active_campaigns_with_settings as acws

    join templates as t on t.campaign_id = acws.id
    join contacts c2 on acws.id = c2.campaign_id

    where c2.aggregated = false and c2.is_valid = false
),

prefinal as (
    select
        acwm.campaign_id,
        acwm.unique_days,
        acwm.phone,
        acwm.phone_id,
        acwm.text,
        acwm.url,
        (acwm.contact_created_at::date-tm.send_at::date) as cntday
    from active_campaigns_with_messages as acwm

    left join templates_messages tm on
        acwm.phone = tm.phone and acwm.campaign_id = tm.campaign_id and
        tm.send_at >= now() - make_interval(days => acwm.unique_days)
),

final as (
    select * from prefinal as pf where cntday > pf.unique_days or cntday is null
)
        
select distinct on (campaign_id, phone) * from final

Ответ нашел сам собой, вот простое решение

→ Ссылка