-
Notifications
You must be signed in to change notification settings - Fork 7.8k
Expand file tree
/
Copy pathincremental_scd_query.sql
More file actions
110 lines (95 loc) · 3 KB
/
incremental_scd_query.sql
File metadata and controls
110 lines (95 loc) · 3 KB
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
CREATE TYPE scd_type AS (
scoring_class scoring_class,
is_active boolean,
start_season INTEGER,
end_season INTEGER
)
WITH last_season_scd AS (
SELECT * FROM players_scd
WHERE current_season = 2021
AND end_season = 2021
),
historical_scd AS (
SELECT
player_name,
scoring_class,
is_active,
start_season,
end_season
FROM players_scd
WHERE current_season = 2021
AND end_season < 2021
),
this_season_data AS (
SELECT * FROM players
WHERE current_season = 2022
),
unchanged_records AS (
SELECT
ts.player_name,
ts.scoring_class,
ts.is_active,
ls.start_season,
ts.current_season as end_season
FROM this_season_data ts
JOIN last_season_scd ls
ON ls.player_name = ts.player_name
WHERE ts.scoring_class = ls.scoring_class
AND ts.is_active = ls.is_active
),
changed_records AS (
SELECT
ts.player_name,
UNNEST(ARRAY[
ROW(
ls.scoring_class,
ls.is_active,
ls.start_season,
ls.end_season
)::scd_type,
ROW(
ts.scoring_class,
ts.is_active,
ts.current_season,
ts.current_season
)::scd_type
]) as records
FROM this_season_data ts
LEFT JOIN last_season_scd ls
ON ls.player_name = ts.player_name
WHERE (ts.scoring_class <> ls.scoring_class
OR ts.is_active <> ls.is_active)
),
unnested_changed_records AS (
SELECT player_name,
(records::scd_type).scoring_class,
(records::scd_type).is_active,
(records::scd_type).start_season,
(records::scd_type).end_season
FROM changed_records
),
new_records AS (
SELECT
ts.player_name,
ts.scoring_class,
ts.is_active,
ts.current_season AS start_season,
ts.current_season AS end_season
FROM this_season_data ts
LEFT JOIN last_season_scd ls
ON ts.player_name = ls.player_name
WHERE ls.player_name IS NULL
)
SELECT *, 2022 AS current_season FROM (
SELECT *
FROM historical_scd
UNION ALL
SELECT *
FROM unchanged_records
UNION ALL
SELECT *
FROM unnested_changed_records
UNION ALL
SELECT *
FROM new_records
) a