PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zaznacz nieciągłe zakresy dat

generate_series()

generate_series() w PostgreSQL funkcja może utworzyć widok, który zawiera listę kolejnych dat:

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;

Wyrażenie select max(date) - min(date) from test może odejść o jeden.

Policz dni w miesiącu

Jednym ze sposobów identyfikacji nieprawidłowych miesięcy jest utworzenie dwóch widoków. Pierwsza zlicza liczbę odczytów dziennych, które każda stacja powinna wykonać w każdym miesiącu. (Zauważ, że climate.calendar jest tłumaczony na climate_calendar .) Drugi zwraca rzeczywiste odczyty dzienne każdej stacji wyprodukowane w miesiącu.

Maksymalna liczba dni w miesiącu na stację

Ten widok zwróci rzeczywistą liczbę dni w miesiącu na stację. (Na przykład luty zawsze będzie miał 28 lub 29 dni).

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

Rzeczywiste dni w miesiącu na stację

Łączna liczba zwróconych dni będzie mniejsza niż suma. (Na przykład styczeń zawsze będzie miał 31 dni lub mniej).

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;

Upuść ORDER BY klauzule w produkcji (są pomocne w rozwoju).

Porównaj widoki

Połącz dwa widoki, aby zidentyfikować stacje i miesiące, które należy oflagować, w nowym widoku:

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

Kolumna num_days_missing nie jest konieczne, ale jest przydatne.

Oto wiersze, które należy zaktualizować:

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

Aktualizuj bazę danych

Aby je zaktualizować, id klawisz jest wygodny.

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. Poprawa wydajności procedur składowanych w PostgreSQL 9.6

  2. Wydajność PostgreSQL ad-hoc SQL vs funkcje

  3. Błąd połączenia AWS RDS Postgres

  4. Ustawianie znacznika czasu wewnątrz transakcji

  5. Migracja PostgreSQL do chmury — porównanie rozwiązań Amazon, Google i Microsoft