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

Đánh dấu các phạm vi ngày không liền kề

create_series ()

generate_series() của PostgreSQL hàm có thể tạo dạng xem chứa danh sách ngày liên tiếp:

with calendar as (
    select ((select min(date) from test)::date + (n || ' days')::interval)::date cal_date
    from generate_series(0, (select max(date) - min(date) from test)) n
)
select cal_date
from calendar c
left join test t on t.date = c.cal_date
where t.date is null;

Biểu thức select max(date) - min(date) from test có thể bị tắt bởi một.

Đếm số ngày mỗi tháng

Một cách để xác định các tháng không hợp lệ là tạo hai chế độ xem. Đầu tiên đếm số lượt đọc hàng ngày mà mỗi đài sẽ tạo ra trong mỗi tháng. (Xin lưu ý rằng climate.calendar được dịch sang climate_calendar .) Thứ hai trả về số đọc thực tế hàng ngày của mỗi đài được sản xuất mỗi tháng.

Số ngày tối đa mỗi tháng mỗi trạm

Chế độ xem này sẽ trả về số ngày thực tế trong một tháng, trên mỗi trạm. (Ví dụ:tháng 2 sẽ luôn có 28 hoặc 29 ngày.)

create view count_max_station_calendar_days as 
with calendar as (
    select ((select min(d) from climate_calendar)::date + (n || ' days')::interval)::date cal_date
    from generate_series(0, (select max(d) - min(d) from climate_calendar)) n
)
select n, extract(year from cal_date) yr, extract(month from cal_date) mo, count(*) num_days
from stations cross join calendar
group by n, yr, mo
order by n, yr, mo

Số ngày thực tế mỗi tháng mỗi trạm

Tổng số ngày được trả lại sẽ ít hơn số ngày được trả lại. (Ví dụ:tháng 1 sẽ luôn có 31 ngày hoặc ít hơn.)

create view count_actual_station_calendar_days as
select n, extract(year from d) yr, extract(month from d) mo, count(*) num_days
from climate_calendar
group by n, yr, mo
order by n, yr, mo;

Thả ORDER BY các mệnh đề trong sản xuất (chúng hữu ích trong quá trình phát triển).

So sánh các lượt xem

Kết hợp hai chế độ xem để xác định các đài và tháng cần được gắn cờ, vào một chế độ xem mới:

create view invalid_station_months as 
select m.n, m.yr, m.mo, m.num_days - a.num_days num_days_missing
from count_max_station_calendar_days m
inner join count_actual_station_calendar_days a
       on (m.n = a.n and m.yr = a.yr and m.mo = a.mo and m.num_days <> a.num_days)

n   yr    mo  num_days_missing
--
A   1982  1   1
E   2007  3   1

Cột num_days_missing không cần thiết, nhưng nó hữu ích.

Đây là những hàng cần được cập nhật:

select cc.* 
from climate_calendar cc
inner join invalid_station_months im 
        on (cc.n = im.n and 
            extract(year from cc.d) = im.yr and
            extract(month from cc.d) = im.mo)
where valid = true

Cập nhật cơ sở dữ liệu

Để cập nhật chúng, hãy id chính là thuận tiện.

update climate_calendar
set valid = false
where id in (
    select id
    from climate_calendar cc
    inner join invalid_station_months im 
        on (cc.n = im.n and 
            extract(year from cc.d) = im.yr and
            extract(month from cc.d) = im.mo)
    where valid = true
);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để đưa kết quả 0/0 vào COUNT tổng hợp?

  2. Làm phẳng các cặp khóa / giá trị tổng hợp từ trường JSONB?

  3. Xóa các hàng có khóa ngoại trong PostgreSQL

  4. psycopg2 cursor.execute () với tham số truy vấn SQL gây ra lỗi cú pháp

  5. Lưu giữ bưu thiếp hoàn toàn trong bộ nhớ