-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3.2.sql
198 lines (185 loc) · 4.54 KB
/
3.2.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
-- Queries from the previous chapter
SELECT a1.species,
a1.name,
a1.primary_color,
a1.admission_date,
( SELECT COUNT (*)
FROM animals AS a2
WHERE a2.species = a1.species
) AS number_of_species_animals
FROM animals AS a1
ORDER BY a1.species ASC,
a1.admission_date ASC;
SELECT species,
name,
primary_color,
admission_date,
COUNT (*)
OVER (PARTITION BY species)
AS number_of_species_animals
FROM animals
ORDER BY species ASC,
admission_date ASC;
-------------
-- Framing --
-------------
-- Count up-to-previous day number of animals of the same species
SELECT a1.species,
a1.name,
a1.primary_color,
a1.admission_date,
( SELECT COUNT (*)
FROM animals AS a2
WHERE a2.species = a1.species
AND
a2.admission_date < a1.admission_date
) AS up_to_previous_day_species_animals
FROM animals AS a1
ORDER BY a1.species ASC,
a1.admission_date ASC;
SELECT species,
name,
primary_color,
admission_date,
COUNT (*)
OVER ( PARTITION BY species
ORDER BY admission_date ASC
ROWS BETWEEN UNBOUNDED PRECEDING
AND
CURRENT ROW
) AS up_to_previous_day_species_animals
FROM animals
ORDER BY species ASC,
admission_date ASC;
-- Same as above, but the wrong answer
SELECT a1.species,
a1.name,
a1.primary_color,
a1.admission_date,
( SELECT COUNT (*)
FROM animals AS a2
WHERE a2.species = a1.species
AND
a2.admission_date <= a1.admission_date
) AS up_to_today_species_animals
FROM animals AS a1
ORDER BY a1.species ASC,
a1.admission_date ASC;
SELECT species,
name,
primary_color,
admission_date,
COUNT (*)
OVER ( PARTITION BY species
ORDER BY admission_date ASC
ROWS BETWEEN UNBOUNDED PRECEDING
AND
1 PRECEDING
) AS up_to_previous_day_species_animals
FROM animals
ORDER BY species ASC,
admission_date ASC;
-- Animals of the same species admitted on the same day
SELECT species,
admission_date,
COUNT (*)
FROM animals
GROUP BY species,
admission_date
HAVING COUNT (*) > 1;
-- Which animals are they?
SELECT *
FROM animals
WHERE admission_date = '2017-08-29';
-- Focus on King and Prince
SELECT a1.species,
a1.name,
a1.primary_color,
a1.admission_date,
( SELECT COUNT (*)
FROM animals AS a2
WHERE a2.species = a1.species
AND
a2.admission_date < a1.admission_date
AND
a2.species = 'Dog'
AND
a2.admission_date > '2017-08-01'
) AS up_to_previous_day_species_animals
FROM animals AS a1
WHERE a1.species = 'Dog'
AND
a1.admission_date > '2017-08-01'
ORDER BY a1.species ASC,
a1.admission_date ASC;
-- CTE(Common Table Expression)s save the day
WITH filtered_animals AS
( SELECT *
FROM animals
WHERE species = 'Dog'
AND
admission_date > '2017-08-01')
SELECT fa1.species, fa1.name,
fa1.primary_color, fa1.admission_date,
( SELECT COUNT (*)
FROM filtered_animals AS fa2
WHERE fa2.species = fa1.species
AND
fa2.admission_date < fa1.admission_date
) AS up_to_previous_day_species_animals
FROM filtered_animals AS fa1
ORDER BY fa1.species ASC, fa1.admission_date ASC;
-- ROWS 1 PRECEDING
SELECT species,
name,
primary_color,
admission_date,
COUNT (*)
OVER ( PARTITION BY species
ORDER BY admission_date ASC
ROWS BETWEEN UNBOUNDED PRECEDING
AND
1 PRECEDING
) AS up_to_yesterday_species_animals
FROM animals
WHERE species = 'Dog'
AND
admission_date > '2017-08-01'
ORDER BY species ASC,
admission_date ASC;/*Incorrect*/
-- RANGE 1 day PRECEDING
SELECT species,
name,
primary_color,
admission_date,
COUNT (*)
OVER ( PARTITION BY species
ORDER BY admission_date ASC
RANGE BETWEEN UNBOUNDED PRECEDING
AND
1 PRECEDING
) AS up_to_previous_day_species_animals
FROM animals
WHERE species = 'Dog'
AND
admission_date > '2017-08-01'
ORDER BY species ASC,
admission_date ASC;/* Frame type to RANGE, but gets an error: PRECEDING/FOLLOWING is not supported for column type date and offset type integer*/
SELECT species,
name,
primary_color,
admission_date,
COUNT (*)
OVER ( PARTITION BY species
ORDER BY admission_date ASC
RANGE BETWEEN UNBOUNDED PRECEDING
AND
'1 day' PRECEDING -- Fix: integer 1 to interval 1 day
) AS up_to_previous_day_species_animals
FROM animals
WHERE species = 'Dog'
AND
admission_date > '2017-08-01'
ORDER BY species ASC,
admission_date ASC;
/*Performance analysis: Window function is 10 times faster than subquery one*/