-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathej13_Metricas.sql
204 lines (169 loc) · 4.93 KB
/
ej13_Metricas.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
199
200
201
202
203
204
-- crear la base de datos
create database ej13_Metricas;
-- usar la base de datos
use ej13_Metricas;
-- 1
drop procedure p_CrearEntidades;
create procedure p_CrearEntidades
as
begin try
begin transaction
create table nivel
(
codigo int not null,
descripcion varchar(30) not null,
primary key(codigo)
);
create table medicion
(
fecha date not null,
hora time not null,
metrica char(5) not null,
temperatura float not null,
presion float not null,
humedad float not null,
nivel int not null,
primary key(fecha, hora, metrica),
foreign key(nivel) references nivel(codigo)
);
commit
end try
begin catch
rollback
end catch;
execute p_CrearEntidades
-- 2
drop function f_ultimaMedicion;
create function f_ultimaMedicion(metrica char(5))
returns datetime
as
begin
declare @fechaHora datetime
declare @ultimaFecha date
declare @ultimaHora time
set @ultimaFecha = (select max(m.fecha) from medicion m where m.metrica = @metrica)
set @ultimaHora = (select max(m.hora) from medicion m where m.metrica = @metrica and m.fecha = ultimaFecha)
set @fechaHora = (select convert(datetime, concat(@ultimaFecha, ' ', @ultimaHora)))
return @fechaHora
end;
declare @var datetime
set @var = (select dbo.f_ultimaMedicion('M1115'))
select @var;
-- 3
drop view mediciones_ultima_semana;
create view medicionesUltimaSemana
as
select m.fecha, m.hora, m.metrica, m.nivel, m.temperatura
from medicion m
where m.fecha between dateAdd(day, -7, getDate()) AND getDate();
drop view todosLosNiveles;
create view todosLosNiveles
as
select m.fecha, m.hora, m.metrica, m.temperatura
from medicion m
where m.metrica not exists (
select distinct mus.metrica
from medicionesUltimaSemana mus, nivel n
where not exists (
select mm.fecha from medicion mm
where mm.metrica = mus.metrica and mm.nivel = n.codigo
)
);
drop view temperaturaMaxima;
create view temperaturaMaxima
as
select max(m.temperatura) as temperatura from todosLosNiveles;
drop view metricaMaxTemp;
create view metricaMaxTemp
as
select distinct m.metrica, tm.temperatura
from todosLosNiveles m
inner join temperaturaMaxima tm on m.temperatura = tm.temperatura;
drop view v_Listado;
create view v_Listado
as
select m.metrica, mmt.temperatura as temperaturaMaxima, count(*) as cantidadMediciones
from todosLosNiveles m
inner join metricaMaxTemp mmt on m.metrica = mmt.metrica
group by m.metrica, mmt.temperatura;
select * from v_Listado;
-- 4
drop procedure p_ListaAcumulados;
create procedure p_ListaAcumulados(@fechaMin date, @fechaMax date)
as
begin try
begin transaction
select sq.*, sum(sq.acDiarioTemp)
over (partition by metrica order by metrica, fecha rows unbounded preceding) as acTemp
from (
select m.fecha, m.metrica, sum(m.temperatura) as acDiarioTemp
from medicion m
where m.fecha between @fechaMin and @fechaMax
group by m.fecha, m.metrica
) sq
commit
end try
begin catch
rollback
end catch;
execute p_ListaAcumulados '20/10/2017', '27/10/2017';
-- 5
drop procedure p_InsertMedicion;
create procedure p_InsertMedicion(@fecha date, @hora time, @metrica char(5), @temperatura float, @presion float, @humedad float, @nivel int)
as
begin try
begin transaction
if not exists (select m.fecha from medicion m where m.fecha = @fecha and m.hora = @hora and m.metrica = @metrica)
if @humedad between 0 and 100
if exists (select n.codigo from nivel n where n.codigo = @nivel)
insert into medicion(fecha, hora, metrica, temperatura, presion, humedad, nivel)
values(@fecha, @hora, @metrica, @temperatura, @presion, @humedad, @nivel)
else
print 'El nivel ingresado no existe'
else
print 'El porcentaje de humedad no se encuentra entre 0 y 100'
else
print 'Ya existe una medicion para esa métrica en la misma fecha y hora'
commit
end try
begin catch
rollback
end catch;
execute p_InsertMedicion '01/02/2017','02:35:20', 1, 100, 80, 99, 4;
-- 6
drop procedure p_DepuraMedicion;
create procedure p_DepuraMedicion(@dias int)
as
begin try
begin transaction
if object_id('Historial','U') is not null
create table Historial
(
fecha date not null,
hora time not null,
metrica char(5) not null,
temperatura float not null,
presion float not null,
humedad float not null,
nivel int not null,
primary key(fecha, hora, metrica),
foreign key(nivel) references nivel(codigo)
);
insert into Historial(fecha, hora, metrica, temperatura, presion, humedad, nivel)
select m.fecha, m.hora, m.metrica, m.temperatura, m.presion, m.humedad, m.nivel
from medicion m
where m.fecha < dateAdd(day, -@dias, getDate());
delete from medicion
where fecha < dateAdd(day, -@dias, getDate());
commit
end try
begin catch
rollback
end catch;
execute p_DepuraMedicion 10;
-- 7
drop trigger tg_descNivel;
create trigger tg_descNivel on nivel
before insert
as
set inserted.descripcion = upper(inserted.descripcion);