-
Notifications
You must be signed in to change notification settings - Fork 2
/
07-Azure-SQL-Identificar-Outliers.sql
65 lines (47 loc) · 1.62 KB
/
07-Azure-SQL-Identificar-Outliers.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
WITH RANGE_DATA AS
(
SELECT [Data], [Moeda], [Taxa_Venda]
FROM [SANDBOX].[dbo].API_BCB_COTACOES
--WHERE YEAR([Data]) = '2015'
),
QUARTILE_VALUES AS
(
-- Calcular o IQR = Q3 - Q1
SELECT *, IQR = (Q3 - Q1)
FROM (
SELECT DISTINCT [Moeda],
-- Ordenar os dados do menor valor ao maior valor
-- Identificar o primeiro quartil (Q1), a mediana e o terceiro quartil (Q3).
PERCENTILE_CONT(0.25) WITHIN GROUP(ORDER BY [Taxa_Venda]) OVER(PARTITION BY [Moeda]) As Q1,
PERCENTILE_CONT(0.50) WITHIN GROUP(ORDER BY [Taxa_Venda]) OVER(PARTITION BY [Moeda]) As Median,
PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY [Taxa_Venda]) OVER(PARTITION BY [Moeda]) As Q3
FROM RANGE_DATA
) AS R1
),
OUTLIER_VALUES AS
(
SELECT *,
-- Calcular limite superior = Q3 + (1.5 * IQR)
UPPER_FENCE = (Q3 + (1.5*IQR)),
-- Calcular limite inferior = Q1 - (1.5 * IQR)
LOWER_FENCE = (Q1 - (1.5*IQR))
FROM QUARTILE_VALUES
)
/* Whisker Type */
SELECT [Moeda], MAX([Taxa_Venda]) AS 'Upper Whisker', MIN([Taxa_Venda]) AS 'Lower Whisker'
FROM (
SELECT [Data], [Moeda], [Taxa_Venda],
(CASE
WHEN [Taxa_Venda] < t2.LOWER_FENCE THEN 'Lower Outlier'
WHEN [Taxa_Venda] > t2.UPPER_FENCE THEN 'Upper Outlier'
ELSE NULL
END) AS OUTLIER_STATUS
FROM RANGE_DATA t1
CROSS APPLY (
SELECT LOWER_FENCE, UPPER_FENCE
FROM OUTLIER_VALUES AS rs
WHERE rs.[Moeda] = t1.[Moeda]
) AS t2
) RS
WHERE OUTLIER_STATUS IS NULL
GROUP BY [Moeda], OUTLIER_STATUS