-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlad_fields.sql
136 lines (125 loc) · 2.68 KB
/
lad_fields.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
CREATE OR REPLACE PROCEDURE lad.fields_proc(
)
LANGUAGE 'plpgsql'
AS $BODY$BEGIN
--Izveido pagaidu datu tabulu.
CREATE TEMPORARY TABLE fields_tmp (
id SERIAL PRIMARY KEY
,parcel_id INTEGER
,period_code SMALLINT
,product_code SMALLINT
,product_description VARCHAR
,aid_forms VARCHAR
,area_declared REAL
,data_changed_date TIMESTAMP
,geom geometry(MultiPolygon, 3059)
);
--Pagaidu datu tabulā importē visu datu kopu no WFS.
INSERT INTO fields_tmp (
parcel_id
,period_code
,product_code
,product_description
,aid_forms
,area_declared
,data_changed_date
,geom
)
SELECT parcel_id
,period_code::SMALLINT
,product_code::SMALLINT
,product_description
,aid_forms
,area_declared
,data_changed_date::TIMESTAMP
,ST_CurveToLine(shape)
FROM lad.lad_lauki;
--Aizpilda produktu kodu tabulu.
INSERT INTO lad.products (
product_code
,product_description
)
SELECT DISTINCT product_code
,product_description
FROM fields_tmp
WHERE product_code NOT IN (
SELECT product_code
FROM lad.products
)
ORDER BY product_code;
--Lauki, kas vairāk neeksistē.
UPDATE lad.fields
SET date_deleted = CURRENT_DATE
FROM lad.fields u
LEFT JOIN fields_tmp s ON u.parcel_id = s.parcel_id
WHERE s.parcel_id IS NULL
AND lad.fields.date_deleted IS NULL
AND lad.fields.id = u.id;
--Lauki, kuriem veiktas izmaiņas kopš pēdējās atjaunināšanas.
WITH b
AS (
SELECT parcel_id
,MAX(data_changed_date) data_changed_date_max
FROM lad.fields
GROUP BY parcel_id
)
UPDATE lad.fields
SET date_deleted = CURRENT_DATE
FROM fields_tmp s
INNER JOIN b ON s.parcel_id = b.parcel_id
WHERE s.data_changed_date > b.data_changed_date_max
AND lad.fields.parcel_id = s.parcel_id
AND date_deleted IS NULL;
WITH b
AS (
SELECT parcel_id
,MAX(data_changed_date) data_changed_date_max
FROM lad.fields
GROUP BY parcel_id
)
INSERT INTO lad.fields (
parcel_id
,period_code
,product_code
,aid_forms
,area_declared
,data_changed_date
,geom
,date_created
)
SELECT s.parcel_id
,s.period_code
,s.product_code
,s.aid_forms
,s.area_declared
,s.data_changed_date
,s.geom
,CURRENT_DATE
FROM fields_tmp s
INNER JOIN b ON s.parcel_id = b.parcel_id
WHERE s.data_changed_date > b.data_changed_date_max;
--Jauni lauki.
INSERT INTO lad.fields (
parcel_id
,period_code
,product_code
,aid_forms
,area_declared
,data_changed_date
,geom
,date_created
)
SELECT s.parcel_id
,s.period_code
,s.product_code
,s.aid_forms
,s.area_declared
,s.data_changed_date
,s.geom
,CURRENT_DATE
FROM lad.fields u
RIGHT OUTER JOIN fields_tmp s ON u.parcel_id = s.parcel_id
WHERE u.parcel_id IS NULL;
END;
$BODY$;
GRANT EXECUTE ON PROCEDURE lad.fields_proc() TO scheduler;