PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tandai rentang tanggal yang tidak bersebelahan

generate_series()

generate_series() PostgreSQL fungsi dapat membuat tampilan yang berisi daftar tanggal berurutan:

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;

Ekspresi select max(date) - min(date) from test mungkin mati satu per satu.

Hitung Hari Per Bulan

Salah satu cara untuk mengidentifikasi bulan yang tidak valid adalah dengan membuat dua tampilan. Yang pertama menghitung jumlah pembacaan harian yang harus dihasilkan setiap stasiun di setiap bulan. (Perhatikan bahwa climate.calendar diterjemahkan ke climate_calendar .) Yang kedua mengembalikan pembacaan harian aktual setiap stasiun yang diproduksi per bulan.

Hari Maksimum Per Bulan Per Stasiun

Tampilan ini akan mengembalikan jumlah hari sebenarnya dalam sebulan, per stasiun. (Misalnya, Februari akan selalu memiliki 28 atau 29 hari.)

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

Hari Sebenarnya Per Bulan Per Stasiun

Jumlah hari yang dikembalikan akan lebih sedikit dari penghitungan. (Misalnya, Januari akan selalu memiliki 31 hari atau kurang.)

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;

Letakkan ORDER BY klausa dalam produksi (sangat membantu dalam pengembangan).

Bandingkan Tampilan

Bergabunglah dengan dua tampilan untuk mengidentifikasi stasiun dan bulan yang perlu ditandai, menjadi tampilan baru:

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

Kolom num_days_missing tidak perlu, tapi berguna.

Ini adalah baris yang perlu diperbarui:

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

Perbarui Basis Data

Untuk memperbaruinya, id kuncinya nyaman.

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. org.hibernate.internal.util.config.ConfigurationException:Tidak dapat menemukan sumber daya cfg.xml [/HibernateTest/src/hibernate.cfg.xml]

  2. Bagaimana cara meningkatkan otomatis di PostgreSQL?

  3. Bagaimana cara terhubung ke localhost dengan postgres_fdw?

  4. Temukan dengan cepat di dekat pengguna menggunakan PostGIS

  5. PostgreSQL/kinerja satu kursor umum atau buat untuk setiap kueri