postgresql - 连接 2 个表,其中两组数字在连接列中重叠

标签 postgresql

我需要使用 postgresql 连接 2 个表,其中两组数字在连接列中重叠。


下图对其进行了解释 - 我需要一张国 session 员及其党派关系表,并将其与选区表结合起来(基于选区的绘制或重新绘制时间)。结果将是显示选区、州和国 session 员相同日期的行。如果某个选区的日期已知而国 session 员的日期未知,则该选区的已知日期会填入该部分,而国 session 员的日期留空 - 反之亦然。

enter image description here


例如,对于表格中的第一行:


国 session 员表:

Arkansas, District 5, Republican: 1940-1945

分区表:

Arkansas, District 5: 1942-1963

以下组合的结果(Start_Comb 和 End_Comb):

1940-1942
1942-1945

对于地区未知的组合(1940-1942),地区日期留空。

最后一组日期列(灰色)只是仅适用于该地区的组合(这非常简单)。


如果您想知道这是做什么用的,我正在创建一个动画 map ,有点像这样,但随着时间的推移,国会选区: https://www.youtube.com/watch?v=vQDyn04vtf8

我最终会得到一张 map ,其中每个已知地区都有一个已知或未知的派对。


还没走多远,这就是我所做的:

SELECT *
FROM congressperson
JOIN districts
ON Start_Dist BETWEEN Start_Cong AND End_Cong
WHERE district.A = district.B
OR End_Dist BETWEEN Start_Cong AND Start_Dist
OR Start_Cong = Start_Dist OR End_Cong= End_Dist;

最佳答案

想法是首先从两个表中列出唯一日期。然后为每个这样的日期找到下一个日期(在这种特殊情况下,日期按州、地区分组,下一个日期查找特定的州、地区)。
所以现在我们有了我们正在寻找的范围列表。现在我们可以根据需要的条件连接(对于这个特殊任务左连接)其他表:

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

关于postgresql - 连接 2 个表,其中两组数字在连接列中重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46288124/

相关文章:

ruby-on-rails - Ruby on Rails - 摆脱事件记录 t.timestamps 列上的毫秒数

r - 如何将 OSM 多边形数据从 PostGIS 导入到 R?

带有时间戳字段的 PostgreSQL 神秘主义

postgresql - Heroku 上的 sailsjs 未在 postgresql 中创建模型

PostgreSQL 9.3 : Split one column into multiple

postgresql - 从 postgres 中的变量表查询

Python 和 psycopg 检测网络错误

sql - 将列添加到表并立即将数据添加到 PostgreSQL 中的列

ruby-on-rails - PostgreSQL JSONB - 使用单个查询更新所有行的键名

java - 准备好的陈述是否以这种方式工作?