sql >> データベース >  >> RDS >> PostgreSQL

結合列内で2セットの数値が重複する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. .ADO.netエンティティデータモデルを生成するときにpostgresqlがデータソースに表示されない

    2. SQLステートメントのリテラルの前のコロンはどういう意味ですか?

    3. tsvectorは英語のみをサポートしていますか?

    4. オラクル。パラメータがnullの場合はすべて選択し、そうでない場合は特定のアイテムの問題を返します