PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Nối 2 bảng trong đó hai bộ số trùng nhau trong các cột nối

Ý tưởng là tạo danh sách các ngày duy nhất từ ​​cả hai bảng trước. Sau đó, đối với mỗi ngày như vậy, hãy tìm ngày tiếp theo (trong trường hợp cụ thể này, ngày được nhóm theo tiểu bang, quận và ngày tiếp theo được tìm kiếm cho tiểu bang, quận cụ thể).
Vì vậy, bây giờ chúng tôi có danh sách các phạm vi chúng tôi đang tìm kiếm. Bây giờ chúng ta có thể nối các bảng khác (đối với tác vụ paticular này là left join) theo các điều kiện bắt buộc:

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. Trình tự ngủ đông không được tạo

  2. Hai câu hỏi để định dạng dấu thời gian và số bằng postgresql

  3. Làm thế nào để chuyển đổi trường dấu thời gian thành int8? Hay chỉ cần bỏ cột và tạo một cột mới?

  4. Postgresql:Làm thế nào để thoát khỏi các dấu ngoặc kép trong trình kích hoạt Cơ sở dữ liệu?

  5. Toán tử IN so với BẤT KỲ trong PostgreSQL