generate_series()
PostgreSQL का generate_series()
फ़ंक्शन एक ऐसा दृश्य बना सकता है जिसमें तिथियों की एक क्रमागत सूची हो:
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;
व्यंजक select max(date) - min(date) from test
एक के बाद एक बंद हो सकता है।
प्रति माह दिनों की गणना करें
अमान्य महीनों की पहचान करने का एक तरीका दो दृश्य बनाना है। पहले प्रत्येक महीने में प्रत्येक स्टेशन को दैनिक रीडिंग की संख्या की गणना करनी चाहिए। (ध्यान दें कि climate.calendar
climate_calendar
. में अनुवाद किया गया है ।) दूसरा प्रति माह उत्पादित प्रत्येक स्टेशन की वास्तविक दैनिक रीडिंग देता है।
प्रति स्टेशन प्रति माह अधिकतम दिन
यह दृश्य प्रति स्टेशन, महीने में दिनों की वास्तविक संख्या लौटाएगा। (उदाहरण के लिए, फरवरी हमेशा 28 या 29 दिन का होगा।)
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
प्रति स्टेशन प्रति माह वास्तविक दिन
लौटाए गए दिनों की कुल संख्या लम्बाई से कम होगी। (उदाहरण के लिए, जनवरी हमेशा 31 दिन या उससे कम का होगा।)
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;
ORDER BY
उत्पादन में खंड (वे विकास में सहायक हैं)।
दृश्यों की तुलना करें
उन स्टेशनों और महीनों की पहचान करने के लिए दो दृश्यों में शामिल हों जिन्हें फ़्लैग करने की आवश्यकता है, एक नए दृश्य में:
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
कॉलम num_days_missing
जरूरी नहीं है, लेकिन यह उपयोगी है।
ये वे पंक्तियाँ हैं जिन्हें अद्यतन करने की आवश्यकता है:
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
डेटाबेस अपडेट करें
उन्हें अपडेट करने के लिए, id
कुंजी सुविधाजनक है।
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
);