你被困在90年代吗?
如果仅使用SQL-92语言参考,那么您将忽略许多出色的功能,例如:
一些测试数据
在上一篇文章中,我将一些CSV Codahale指标导入PostgreSQL中以进行进一步分析。
我们的时间序列数据包括总请求计数和数据记录时间戳:
计数 | Ť |
---|---|
151 | 1398778568 |
169 | 1398778583 |
169 | 1398778598 |
169 | 1398778613 |
169 | 1398778628 |
169 | 1398778643 |
1587 | 1398778658 |
6473 | 1398778673 |
11985 | 1398778688 |
到达速度
我想计算到达速度,可以将其定义为:
λ=到达速度=Δcount/Δt
对于每个时间事件,我们需要减去当前和以前的计数以及时间戳记值。
窗口函数使我们能够聚合/引用上一行/下一行,而不必将SELECT子句限制为单个结果行:
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_acceleration =Δarrival_velocity/Δt
这是我们可以做到的:
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 / 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提供了比标准聚合函数更多的功能。 窗口功能使您可以将行分组,同时仍保留选择条件。
你们中仍有多少人仍在使用Java,C#或Python 1.0版本? 我们不应该像使用日常使用的任何其他编程语言一样,从最新的SQL功能中受益吗?
如果您仍然持怀疑态度,这篇很棒的文章可能会打消您的疑问。
翻译自: https://www.javacodegeeks.com/2014/05/time-to-break-free-from-the-sql-92-mindset.html