Вы застряли в 90-х?
Если вы используете только справочник по языку SQL-92 , вы упускаете из виду множество замечательных функций, таких как:
Некоторые тестовые данные
В моей предыдущей статье я импортировал некоторые метрики CSV Codahale в PostgreSQL для дальнейшего анализа.
Данные нашего временного ряда состоят из общего количества запросов и отметки времени записи данных:
подсчитывать | T |
---|---|
151 | 1398778568 |
169 | 1398778583 |
169 | 1398778598 |
169 | 1398778613 |
169 | 1398778628 |
169 | 1398778643 |
1587 | 1398778658 |
6473 | 1398778673 |
11985 | 1398778688 |
Скорость прибытия
Я хочу рассчитать скорость прибытия, которая может быть определена как:
λ = прибытие_скорость = Δcount / Δt
Для каждого временного события нам нужно вычесть текущее и предыдущее значение счетчика и отметки времени.
Оконные функции позволяют нам агрегировать / ссылаться на предыдущие / следующие строки, не ограничивая предложение SELECT одной строкой результата:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
SELECT t as "Current time stamp" , prev_t as "Previous time stamp" , current_count as "Current total request count" , prev_count as "Previous total request count" , ROUND(((current_count - prev_count):: numeric /(t - prev_t):: numeric ), 3) as "Velocity [req/sec]" FROM ( SELECT t, lag(t, 1) over () as prev_t, count as current_count, lag( count , 1) over () as prev_count FROM connection_lease_millis WINDOW grouping AS ( ORDER BY t ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) ) raw_data |
Давая нам скорость прибытия:
Текущее время | Предыдущая отметка времени | Текущее общее количество запросов | Общее количество предыдущих запросов | Скорость [рек / сек] |
---|---|---|---|---|
1398778568 | 151 | |||
1398778583 | 1398778568 | 169 | 151 | 1,200 |
1398778598 | 1398778583 | 169 | 169 | 0,000 |
1398778613 | 1398778598 | 169 | 169 | 0,000 |
1398778628 | 1398778613 | 169 | 169 | 0,000 |
1398778643 | 1398778628 | 169 | 169 | 0,000 |
1398778658 | 1398778643 | 1587 | 169 | 94,533 |
1398778673 | 1398778658 | 6473 | 1587 | 325,733 |
1398778688 | 1398778673 | 11985 | 6473 | 367,467 |
Ускорение прибытия
Но что, если мы хотим рассчитать ускорение прибытия (например, чтобы мы могли выяснить, как колеблется скорость прибытия), то есть
прибытие-ускорение = Δarrival_velocity / Δt
Вот как мы можем это сделать:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
SELECT t as "Current time stamp" , prev_t as "Previous time stamp" , velocity "Velocity [Req/sec]" , ROUND((velocity - lag(velocity, 1) over ()):: numeric /(t - prev_t):: numeric , 3) as "Acceleration [req/sec2]" FROM ( SELECT t, prev_t, current_count, prev_count, ROUND(((current_count - prev_count):: numeric /(t - prev_t):: numeric ), 3) as velocity FROM ( SELECT t, lag(t, 1) over () as prev_t, count as current_count, lag( count , 1) over () as prev_count FROM connection_lease_millis WINDOW grouping AS ( ORDER BY t ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) ) raw_data ) velocity_data |
Давать нам:
Текущее время | Предыдущая отметка времени | Скорость [Req / sec] | Ускорение [req / sec2] |
---|---|---|---|
1398778568 | |||
1398778583 | 1398778568 | 1,200 | |
1398778598 | 1398778583 | 0,000 | -0,080 |
1398778613 | 1398778598 | 0,000 | 0,000 |
1398778628 | 1398778613 | 0,000 | 0,000 |
1398778643 | 1398778628 | 0,000 | 0,000 |
1398778658 | 1398778643 | 94,533 | 6,302 |
1398778673 | 1398778658 | 325,733 | 15,413 |
1398778688 | 1398778673 | 367,467 | 2,782 |
Дайте нам хороший обзор распределения ставок:
Вывод
SQL может предложить больше, чем стандартные агрегатные функции. Функции окна позволяют группировать строки, сохраняя при этом критерии выбора.
Сколько из вас все еще используют версии 1.0 Java, C # или Python? Разве мы не должны пользоваться новейшими функциями SQL так же, как и с любым другим языком программирования, который мы используем ежедневно?
Если вы все еще скептически, эта замечательная статья может разрушить ваши сомнения.
Ссылка: | Пора освободиться от мышления SQL-92 от нашего партнера JCG Влада Михалча в блоге Влада Михалча . |