Статьи

Время вырваться из мышления SQL-92

Вы застряли в 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

Дайте нам хороший обзор распределения ставок:

arrival_velocity_acceleration1

Вывод

SQL может предложить больше, чем стандартные агрегатные функции. Функции окна позволяют группировать строки, сохраняя при этом критерии выбора.

Сколько из вас все еще используют версии 1.0 Java, C # или Python? Разве мы не должны пользоваться новейшими функциями SQL так же, как и с любым другим языком программирования, который мы используем ежедневно?

Если вы все еще скептически, эта замечательная статья может разрушить ваши сомнения.