PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Свържете 2 таблици, където два набора от числа се припокриват в рамките на свързващите колони

Идеята е първо да се направи списък с уникални дати от двете таблици. След това за всяка такава дата намерете следващата дата (в този конкретен случай датите са групирани по щат, област и следващата дата се търси за определен щат, област).
Така че сега имаме списък с диапазони, които търсим. Сега можем да присъединим (за тази конкретна задача ляво присъединяване) други таблици чрез необходимите условия:

select
    r.state,
    c.start_cong,
    c.end_cong,
    c.party,
    coalesce(c.district, d.district) district,
    d.start_dist,
    d.end_dist,
    start_comb,
    end_comb,
    case when d.district is not null then start_comb end final_start,
    case when d.district is not null then end_comb end final_end
from (
    with dates as (
        select
            *
        from (
            SELECT 
                c.state,
                c.district,
                start_cong date
            FROM congressperson c
            union 
            SELECT
                c.state,
                c.district, 
                end_cong
            FROM congressperson c
            union 
            SELECT 
                d.state,
                d.district,
                start_dist
            FROM district d 
            union 
            SELECT
                d.state,
                d.district, 
                end_dist
            FROM district d 
        ) DATES
        group by 
            state,
            district,
            date
        order by 
            state,
            district,    
            date
    ) 
    select
        dates.state,
        dates.district,
        dates.date start_comb,
    (select 
        d.date 
    from 
        dates d
    where
        d.state = dates.state and
        d.district = dates.district and
        d.date > dates.date
    order by 
        d.date
    limit 1
    ) end_comb
    from 
        dates) r
left join congressperson c on 
                            c.state = r.state and
                            c.district = r.district and
                            start_comb between c.start_cong and c.end_cong and 
                            end_comb between c.start_cong and c.end_cong
left join district d on 
                        d.state = r.state and
                        d.district = r.district and
                        start_comb between d.start_dist and d.end_dist and 
                        end_comb between d.start_dist and d.end_dist
where
    end_comb is not null 
order by 
    r.state, coalesce(c.district, d.district), start_comb, end_comb, start_cong, end_cong



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. QPSQL драйверът не е зареден Qt

  2. Как да се направи заявка за стойности, които имат най-висок брой гласове и без флагове в PostgreSQL?

  3. Как да покажа WORK_MEM на външни PostgreSQL връзки?

  4. Наблюдавате ли влошаване на производителността на PostgreSQL TEMP TABLE след 8.3?

  5. Micronaut не се свързва с db в yml